概念帮助单个列表中包含不同的类<>?

罗丹

活跃成员
已加入
2015年4月7日
留言内容
41
编程经验
10+
我正在使用beaglebone / mono开发一个项目,我想在单个datagridview上显示输入,输出,警报等。问题在于这些类的类完全不同。我可以只使用单独的类并手动填充DGV,但我认为应该有一种使用"info"类以包含所有其他类,然后使用"Info"填充控件的类。

我能想到的唯一方法是使用type的成员"Object"指向实际的类,以使信息类条目与列表相同<>和控制有关。那我就得弄清楚哪一堂课"Object"是,并在需要时提取适当的信息。

这是一个好方法还是有人可以提出更优雅的建议。不一定需要代码,只需向正确的方向移动即可。

谢谢!

P.S.使用VS2013或2015
 

金西尼

C#论坛主持人
工作人员
已加入
2011年4月23日
留言内容
3,566
地点
悉尼,澳大利亚
编程经验
10+
如果您真的想走这条路,那么可以定义一个包装器类,该包装器类了解所有其他类型,并可以提取它们的数据并通过一组通用属性公开它们。然后,您可以创建一个该类型的列表,其中每个项目都包裹一个原始类之一的实例。然后,您可以简单地将列表绑定到网格。您的课程可能看起来像这样:
    internal class FirstItemType
    {
        public string SomeText { get; set; }
        public int SomeNumber { get; set; }
    }

    internal class SecondItemType
    {
        public string MyText { get; set; }
        public int MyNumber { get; set; }
    }

    internal class ItemWrapper
    {
        private FirstItemType firstInstance;
        private SecondItemType secondInstance;

        public ItemWrapper(FirstItemType firstInstance)
        {
            this.firstInstance = firstInstance;
        }

        public ItemWrapper(SecondItemType secondInstance)
        {
            this.secondInstance = secondInstance;
        }

        public string Text
        {
            get
            {
                string value = null;

                if (firstInstance != null)
                {
                    value = firstInstance.SomeText;
                }
                else if (secondInstance != null)
                {
                    value = secondInstance.MyText;
                }

                return value;
            }
            set
            {
                if (firstInstance != null)
                {
                    firstInstance.SomeText = value;
                }
                else if (secondInstance != null)
                {
                    secondInstance.MyText = value;
                }
            }
        }

        public int Number
        {
            get
            {
                int value = 0;

                if (firstInstance != null)
                {
                    value = firstInstance.SomeNumber;
                }
                else if (secondInstance != null)
                {
                    value = secondInstance.MyNumber;
                }

                return value;
            }
            set
            {
                if (firstInstance != null)
                {
                    firstInstance.SomeNumber = value;
                }
                else if (secondInstance != null)
                {
                    secondInstance.MyNumber = value;
                }
            }
        }
    }
编写起来有点费力,但是一旦有了,就可以很容易地使用不同的类型。
 

罗丹

活跃成员
已加入
2015年4月7日
留言内容
41
编程经验
10+
那不是我想要描述的(我认为)。包装器类实例一次只能分配一个包装的类实例,我想您的目标是example(?)中的两个。

哦,等等...现在我明白了。公共方法是通过分配给它的类的类型来调用的(我还没有以这种方式使用多个公共方法)。

我想知道是否可以使用基于包装的类类型而不是大量的if-thens的switch块。

非常感谢您的解释。真的有帮助!
 

约翰·H

C#论坛主持人
工作人员
已加入
2011年4月23日
留言内容
1,076
地点
挪威
编程经验
10+
如果可以修改不同的类型,则可以定义一个接口并在这些类型中实现该接口,然后使用list<Interfacetype>作为数据源。您可以将实现该接口的任何对象添加到此列表。 DataGridView将使用接口属性来显示来自不同对象的数据。
 

金西尼

C#论坛主持人
工作人员
已加入
2011年4月23日
留言内容
3,566
地点
悉尼,澳大利亚
编程经验
10+
我想知道是否可以使用基于包装的类类型而不是大量的if-thens的switch块。

不,你不能。与VB.NET中的“选择大小写”不同,C#中的“开关”在每个“大小写”中都需要常量值。这基本上意味着值类型或字符串。
 

StoneCodeMonkey

新成员
已加入
2016年7月7日
留言内容
3
编程经验
10+
抽象的

定义一个具有抽象属性的抽象类,以便以一致的方式发布数据。然后在每个现有类中实现抽象类。

C#:
    [COLOR=#569cd6][B]abstract[/B][/COLOR] [COLOR=#569cd6][B]class[/B][/COLOR] [COLOR=#4ec9b0]AbstractPublisher[/COLOR]
    {
        [COLOR=#569cd6][B]public[/B][/COLOR] [COLOR=#569cd6][B]abstract[/B][/COLOR] [COLOR=#569cd6][B]string[/B][/COLOR] [COLOR=white]MyData[/COLOR] { [COLOR=#569cd6][B]get[/B][/COLOR]; [COLOR=#569cd6][B]set[/B][/COLOR]; }    
    }
 
    [COLOR=#569cd6][B]class[/B][/COLOR] [COLOR=#4ec9b0]MyClass[/COLOR]:[COLOR=#4ec9b0]AbstractPublisher[/COLOR]
    {
 
        [COLOR=#569cd6][B]public[/B][/COLOR] [COLOR=#569cd6][B]override[/B][/COLOR] [COLOR=#569cd6][B]string[/B][/COLOR] [COLOR=white]MyData[/COLOR]
        {
            [COLOR=#569cd6][B]get[/B][/COLOR]
            {
                [COLOR=#569cd6][B]throw[/B][/COLOR] [COLOR=#569cd6][B]new[/B][/COLOR] [COLOR=#4ec9b0]NotImplementedException[/COLOR]();
            }
            [COLOR=#569cd6][B]set[/B][/COLOR]
            {
                [COLOR=#569cd6][B]throw[/B][/COLOR] [COLOR=#569cd6][B]new[/B][/COLOR] [COLOR=#4ec9b0]NotImplementedException[/COLOR]();
            }
        }
    }

覆盖抽象属性,并使用它们来发布数据。
 

金西尼

C#论坛主持人
工作人员
已加入
2011年4月23日
留言内容
3,566
地点
悉尼,澳大利亚
编程经验
10+
定义一个具有抽象属性的抽象类,以便以一致的方式发布数据。然后在每个现有类中实现抽象类。

C#:
    [COLOR=#569cd6][B]abstract[/B][/COLOR] [COLOR=#569cd6][B]class[/B][/COLOR] [COLOR=#4ec9b0]AbstractPublisher[/COLOR]
    {
        [COLOR=#569cd6][B]public[/B][/COLOR] [COLOR=#569cd6][B]abstract[/B][/COLOR] [COLOR=#569cd6][B]string[/B][/COLOR] [COLOR=white]MyData[/COLOR] { [COLOR=#569cd6][B]get[/B][/COLOR]; [COLOR=#569cd6][B]set[/B][/COLOR]; }    
    }
 
    [COLOR=#569cd6][B]class[/B][/COLOR] [COLOR=#4ec9b0]MyClass[/COLOR]:[COLOR=#4ec9b0]AbstractPublisher[/COLOR]
    {
 
        [COLOR=#569cd6][B]public[/B][/COLOR] [COLOR=#569cd6][B]override[/B][/COLOR] [COLOR=#569cd6][B]string[/B][/COLOR] [COLOR=white]MyData[/COLOR]
        {
            [COLOR=#569cd6][B]get[/B][/COLOR]
            {
                [COLOR=#569cd6][B]throw[/B][/COLOR] [COLOR=#569cd6][B]new[/B][/COLOR] [COLOR=#4ec9b0]NotImplementedException[/COLOR]();
            }
            [COLOR=#569cd6][B]set[/B][/COLOR]
            {
                [COLOR=#569cd6][B]throw[/B][/COLOR] [COLOR=#569cd6][B]new[/B][/COLOR] [COLOR=#4ec9b0]NotImplementedException[/COLOR]();
            }
        }
    }

覆盖抽象属性,并使用它们来发布数据。
假设每个派生类型具有相同的属性集是有意义的。 OP说这些类完全不同,因此在这种情况下我认为那没有道理。
 

StoneCodeMonkey

新成员
已加入
2016年7月7日
留言内容
3
编程经验
10+
当然可以,但是...

假设每个派生类型具有相同的属性集是有意义的。 OP说这些类完全不同,因此在这种情况下我认为那没有道理。

可以,但是关键是OP希望使用通用的DGV来显示数据。因此,如果OP具有一个公共的抽象类,甚至是要从其继承的基类,那么这将简化产生这些对象的集合的过程。一旦将对象收集到集合中,就可以轻松地将它们显示在DGV中。

最简单的方法是缺少实现一个类来跟踪每种对象类型的每个实例并将需要呈现的数据转换为DGV的格式或公共对象的类。

DGV需要一个集合,那么为什么不将必需的属性烘烤到基类中,然后将它们添加到适合DGV的集合类型中呢?

问候,

BTW,基于标题"概念性帮助单个类别中的不同类别 列表 <>?",抽象或基类直接支持List的想法<AbstractDataSource>。这使OP可以拥有他们要查找的单个列表。

C#:
namespace Abstract
{
    class Program
    {
        static void Main(string[] args)
        {
            MyClass c = new MyClass();
            c.Iterate();
            Console.Read();
        }
    }


    abstract class AbstractDataPublisher
    {
        public abstract string MyData { get; }
    }


    class Class1 : AbstractDataPublisher
    {
        string data;
        public override string MyData
        {
            get
            {
                return data;
            }


        }
        public Class1()
        {
            data = "Class1.Tada!";
        }


    }
    class Class2 : AbstractDataPublisher
    {


        int data;
        public override string MyData
        {
            get
            {
                return string.Format("Class{0}.Tada!", data.ToString());
            }
        }


        public Class2()
        {
            data = 2;
        }
    }
    class Class3 : AbstractDataPublisher
    {
        double data;
        public override string MyData
        {
            get
            {
                return string.Format("Class{0}.Tada!", data.ToString());
            }
        }


        public Class3()
        {
            data = 3d;
        }
    }


    class MyClass
    {
        List<AbstractDataPublisher> myList;


        public MyClass()
        {
            myList = new List<AbstractDataPublisher>();


            myList.Add(new Class1());
            myList.Add(new Class2());
            myList.Add(new Class3());
        }


        public void Iterate()
        {
            foreach (var item in myList)
            {
                Console.WriteLine(item.MyData);
            }
        }


    }
}
 
Last edited:

金西尼

C#论坛主持人
工作人员
已加入
2011年4月23日
留言内容
3,566
地点
悉尼,澳大利亚
编程经验
10+
可以,但是关键是OP希望使用通用的DGV来显示数据。因此,如果OP具有一个公共的抽象类,甚至是要从其继承的基类,那么这将简化产生这些对象的集合的过程。一旦将对象收集到集合中,就可以轻松地将它们显示在DGV中。

最简单的方法是缺少实现一个类来跟踪每种对象类型的每个实例并将需要呈现的数据转换为DGV的格式或公共对象的类。

DGV需要一个集合,那么为什么不将必需的属性烘烤到基类中,然后将它们添加到适合DGV的集合类型中呢?

问候,

BTW,基于标题"概念性帮助单个类别中的不同类别 列表 <>?",抽象或基类直接支持List的想法<AbstractDataSource>。这使OP可以拥有他们要查找的单个列表。

C#:
namespace Abstract
{
    class Program
    {
        static void Main(string[] args)
        {
            MyClass c = new MyClass();
            c.Iterate();
            Console.Read();
        }
    }


    abstract class AbstractDataPublisher
    {
        public abstract string MyData { get; }
    }


    class Class1 : AbstractDataPublisher
    {
        string data;
        public override string MyData
        {
            get
            {
                return data;
            }


        }
        public Class1()
        {
            data = "Class1.Tada!";
        }


    }
    class Class2 : AbstractDataPublisher
    {


        int data;
        public override string MyData
        {
            get
            {
                return string.Format("Class{0}.Tada!", data.ToString());
            }
        }


        public Class2()
        {
            data = 2;
        }
    }
    class Class3 : AbstractDataPublisher
    {
        double data;
        public override string MyData
        {
            get
            {
                return string.Format("Class{0}.Tada!", data.ToString());
            }
        }


        public Class3()
        {
            data = 3d;
        }
    }


    class MyClass
    {
        List<AbstractDataPublisher> myList;


        public MyClass()
        {
            myList = new List<AbstractDataPublisher>();


            myList.Add(new Class1());
            myList.Add(new Class2());
            myList.Add(new Class3());
        }


        public void Iterate()
        {
            foreach (var item in myList)
            {
                Console.WriteLine(item.MyData);
            }
        }


    }
}

我同意你刚才所说的一切,但我以前的发言仍然成立。如果派生类(如OP所述)显着不同,则您所建议的根本行不通。如果两者相差不大,那么您的建议就很棒。如果是这样,那就毫无帮助。
 
最佳 底部