有没有办法列出两种不同的类型

时间:2013-08-30 14:16:56

标签: c#

我正在尝试创建一个用于存储数据网格视图数据源的列表 但是数据网格视图的数据源类型是“字符串”或“十进制”

我制作了这段代码

List<string> list1 = (List<string>)DataGridView.Datasource;
List<decimal> list2 = (List<decimal>)DataGridView.Datasource;

两种不同类型的列表,但我想通过仅声明一个列表来实现此目的 请帮帮我..

5 个答案:

答案 0 :(得分:4)

使用List<object>或更糟ArrayList (请不要使用ArrayList)。

List<object> list = (List<object>)DataGridView.datasource;

您还可以查看List<dynamic>

List<dynamic> list = new List<dynamic>();
list.Add(1);
list.Add("ABCD");
list.Add(1f);

foreach (var item in list)
{
    Console.WriteLine(item.GetType());
}

,输出为:

System.Int32
System.String
System.Single

(不确定是否可以从List<dynamic>投射GridView中的DataSource

答案 1 :(得分:2)

如果需要,可以将数据源强制转换为IList(非通用版本)。

IList data = (IList)DataGridView.Datasource;

这将允许您以object类型访问列表中的项目。

另一个选择是简单地检查列表的类型并采取相应的行动:

if(DataGridView.Datasource is List<string>)
{
    List<string> list = (List<string>)DataGridView.Datasource;
}
else
{
    List<decimal> list = (List<decimal>)DataGridView.Datasource;
}

如果您需要将对象键入为字符串或小数,并且无法将它们作为对象使用,那么您将会这样做。

答案 2 :(得分:0)

如果DataGridView.datasourceList<decimal>,那么您需要实例化一个新列表并手动添加每个对象:

List<object> myList = new List<object>();
foreach(var item in DataGridView.datasource)
{
    myList.Add(item);
}

但正如DanielMann所说,你真的应该定义一个合适的类来处理你的两种类型的对象,而不是仅仅将它们变成List<object> ......

答案 3 :(得分:0)

因为还没有其他人提到过这个......

还有一个CompositeCollection可用于在一个兼容IList的集合中存储不同类型的对象。

public class MyObject()
{
    public string SomeData { get; set; }
    public int SomeOtherData { get; set; }
}

public class MyOtherObject()
{
    public Guid ID { get; set; }
    public object Foo { get; set; }
}

public class Main()
{
    private List<MyObject> objects = new List<MyObject>();
    private List<MyOtherObject> moreObjects = new List<MyOtherObject>();

    public CompositeCollection TheCollection { get; private set; }

    public Main()
    {
        //mock adding data to the list
        objects.Add( ... );
        moreObjects.Add ( ... );

        //Build the composite collection
        TheCollection = new CompositeCollection
        {
            new CollectionContainer {Collection = objects},
            new CollectionContainer {Collection = moreObjects}                  
        };
    }
}

答案 4 :(得分:-1)

List<object> genericList = (List<object>)DataGridView.datasource;

会解决这个问题吗?

以下是使用LINQ的示例转换。

List<decimal> dList = new List<decimal>();
List<object> oList = new List<object>();
oList = dList.Select(x => (object)x).ToList<object>();