【问题标题】:Add object of type T to object of type List<T>将 T 类型的对象添加到 List<T> 类型的对象
【发布时间】:2019-05-17 05:47:16
【问题描述】:

我正忙于构建自己的属性网格。我目前正在努力解决的问题之一是处理集合。专门将新项目添加到集合中。

我有一个名为 CollectionDataSource 的对象,它是一个包含 T 类型对象的列表。

我正在获取 T 的类型并创建一个新的 T 对象,如下所示:

var type = CollectionDataSource.GetType().GetGenericArguments().Single();
var newItem = Activator.CreateInstance(type);

现在我需要将 newItem 添加到 CollectionDataSource。问题是 CollectionDataSource 是对象类型。我尝试过转换为 IEnumerable 和 ICollection 但这些接口无法添加新项目。

如何将 newItem 添加到 CollectionDataSource?

更新

请参阅下面的答案。我所要做的就是将集合转换为 IList。这对我有用

【问题讨论】:

  • 您可以转换为 IEnumerable 然后转换为 List 还是直接转换为 List?
  • 如果我事先不知道列表的类型,如何转换到列表?
  • 你怎么能确定CollectionDataSource的类型支持添加元素的操作呢?
  • @Sweeper 没有保证,但应该是这样。如果不是,那么显然会抛出一个错误,这很好

标签: c#


【解决方案1】:

为什么不首先将其转换为列表?

var myObject = something as List<object>;

if (myObject != null)
{
  // successfully cast
}
else
{
  // cast failed
}

或者如果你知道类型的话:

public static Object TryConvertTo<T>(string input)
{
    Object result = null;
    try
    {
        result = Convert.ChangeType(input, typeof(T));
    }
    catch
    {
    }

    return result;
}

【讨论】:

  • var c = CollectionDataSource as List 给了我一个空变量
  • CollectionDataSource 和 newItem 属于同一类型。因此可以将 newItem 添加到 CollectionDataSource,但问题是事先不知道类型。我需要在运行时以某种方式确定这一点并将作为对象的 CollectionDataSource 转换为 List 其中 T 在运行时定义
【解决方案2】:
T toAdd = Convert.ChangeType((IItemsSource)Activator.CreateInstance(type), typeof(T));

然后创建一个简单的Add方法:

public void Add<T>(T toAdd) where T: class { _list.Add(toAdd); }

【讨论】:

    【解决方案3】:

    似乎答案很简单。我所要做的就是将 CollectionDataSource 转换为 (IList)。问题解决了

        var type = CollectionDataSource.GetType().GetGenericArguments().Single();
        var newItem = Activator.CreateInstance(type);
    
        var a = (IList)CollectionDataSource;
        a.Add(newItem);
    

    【讨论】:

    • 那是什么问题?显式接口实现?
    猜你喜欢
    • 2010-10-19
    • 1970-01-01
    • 2013-08-29
    • 2021-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-09
    • 2011-05-06
    相关资源
    最近更新 更多