好的,所以我在项目中使用泛型,有时我想遍历类的所有属性并确定其类型。或者,更确切地说,我想知道给定的属性是X还是从X派生。
因此,我使用以下行(带有示例类):
if (typeof(GenericDataObjectWithUniqueID).IsAssignableFrom(props[i].PropertyType))
如果该属性是类GenericDataObjectWithUniqueID或派生自该类,它将通过if条件。
但是对于泛型类,我就是无法做到。
我的通用类非常简单,就是这样:
public class GenericPrimitiveContainer<T>
{
private T _value;
public T Value
{
get
{
return _value;
}
set
{
_value = value;
}
}
}
我想循环访问其属性的类包含这样的通用类,如下所示:
public GenericPrimitiveContainer<int> IContainer
但是,如果我们回到上面的行并替换,那将不起作用:
if (typeof(GenericPrimitiveContainer).IsAssignableFrom(props[i].PropertyType))
实际上,它会产生编译错误。
所以我尝试了这个:
if (typeof(GenericPrimitiveContainer<>).IsAssignableFrom(props[i].PropertyType))
它可以编译,但不捕获相关属性。
我也可以使用这个:
if (typeof(GenericPrimitiveContainer<int>).IsAssignableFrom(props[i].PropertyType))
这行得通,但显然根本不是通用的。
如果可能的话,我想做的是获取它的类型,然后获取泛型(在这种情况下为int),然后实例化该类并根据泛型向其分配数据。 / p>
有人可以帮忙吗?
答案 0 :(得分:1)
您必须创建具体的泛型类型,以检查它是否可以从给定的属性类型中分配。我想您遍历了示例中的所有类型属性,所以这是我为您解决的问题的解决方案:
for (int i = 0; i < props.Length; i++)
{
var propertyType = props[i].PropertyType;
if (!propertyType.IsGenericType)
continue;
var genericArgs = propertyType.GetGenericArguments();
if (genericArgs.Length != 1)
continue;
var container = typeof(GenericPrimitiveContainer<>);
var containerWithArguments = container.MakeGenericType(genericArgs);
if (containerWithArguments.IsAssignableFrom(propertyType))
// Do something here
}