从列表<T>反射获取列表<>(来自通用容器类型的容器类型)

马塔斯·维特凯维奇乌斯(Matas Vaitkevicius)

我有一个特殊的情况,在其中一个反射器中,我可以得到需要重新充气的不同类型的容器(例如对其进行克隆)。当引入新型容器时,这种情况开始发生(ObservableCollection<T>

在克隆机制中,我发现的是:

if (property.PropertyType.FullName.Contains(ReflectorResources.ListName) || property.PropertyType.FullName.Contains("ConcurrentBag"))
{
    var listElementType = property.PropertyType.GenericTypeArguments[0];
    var newList = (property.PropertyType.FullName.Contains(ReflectorResources.IncidentListName))
         ? Activator.CreateInstance(typeof(Definitions.Session.Products.Motor.IncidentList<>).MakeGenericType(listElementType))
         : property.PropertyType.FullName.Contains("ConcurrentBag") ? Activator.CreateInstance(typeof(ConcurrentBag<>).MakeGenericType(listElementType)) : Activator.CreateInstance(typeof(List<>).MakeGenericType(listElementType));    
    var oneItem = Activator.CreateInstance(listElementType);
}

所以我试图像这样重写它:

if (new[] { ".Collections." }.Any(o => property.PropertyType.FullName.Contains(o)))
{
    var listElementType = property.PropertyType.GenericTypeArguments[0];
    var listType = property.PropertyType;
    var constructedListType = listType.MakeGenericType(listElementType);
    var newList = Activator.CreateInstance(constructedListType);
    var oneItem = Activator.CreateInstance(listElementType);
}

但是它在网上炸毁:var constructedListType = listType.MakeGenericType(listElementType);有错误

System.InvalidOperationException:方法只能在Type.IsGenericParameter为true的Type上调用。

我的猜测是我需要List<>List<Something>...中提取类型

如何从通用容器类型获取容器类型?

罗曼·阿加

代替这个:

var listElementType = property.PropertyType.GenericTypeArguments[0];
var listType = property.PropertyType;
var constructedListType = listType.MakeGenericType(listElementType);

试试这个:

Type listElementType = property.PropertyType.GenericTypeArguments[0];
Type constructedListType;
if (! property.PropertyType.IsGenericTypeDefinition)
    constructedListType = property.PropertyType;
else
{
    // Depending on where your property comes from
    // This should not work in the case the property type is List<T>
    // How listElementType should allow you to instantiate your type ?
    var listType = property.PropertyType.GetGenericTypeDefinition();
    constructedListType = listType.MakeGenericType(listElementType);
}

我也是说您应该看一下GetGenericTypeDefinition()方法,但是在我写完这个之前,已经有AakashM的答案了。
那你应该看看他的答案。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

使用反射获取列表属性类型

来自分类Dev

如何使用反射获取特定类型的通用列表

来自分类Dev

获取枚举类型并创建该类型的列表,获取类类型并创建具有反射类型的列表

来自分类Dev

如何创建class <T>的开放通用类型列表?

来自分类Dev

如何返回扩展某些内容的通用类型T的列表

来自分类Dev

如何将类型列表输入通用类<T>

来自分类Dev

如何在c#中使用反射获取列表类型元素

来自分类Dev

从通用列表类型获取Java类名称

来自分类Dev

从通用类获取ICollection类型的属性的列表

来自分类Dev

通用实现获取类型列表的大小

来自分类Dev

按类型创建列表<T>

来自分类Dev

如何创建从反射获得的类型列表

来自分类Dev

获取列表的类型

来自分类Dev

如何使用反射将每个“ MyTypes”列表传递给具有T:MyType约束的通用方法?

来自分类Dev

泛型反射,如何获取列表?

来自分类Dev

使用反射从列表中获取对象

来自分类Dev

泛型反射,如何获取列表?

来自分类Dev

使用反射从通用列表转换为特定列表

来自分类Dev

使用反射从通用列表转换为特定列表

来自分类Dev

使用反射从通用列表转换为特定列表

来自分类Dev

获取通用T的类型

来自分类Dev

如何通过反射使样本类型成为列表类型?

来自分类Dev

T记录类型泄漏内存列表

来自分类Dev

绑定列表<T>来自UserControl

来自分类Dev

通过泛型T获取实体对象的列表,泛型T是EntityObject的类型

来自分类Dev

通用类型列表的获取器(作为参数传递)

来自分类Dev

将未知类型的列表转换为通用列表类型

来自分类Dev

反射-如何在类型列表之间进行比较

来自分类Dev

在 jade 中获取容器中的代理列表

Related 相关文章

热门标签

归档