C# 如果属性是泛型类,则获取属性类型
好的,所以我在我的项目中使用泛型,有时我想遍历类的所有属性并确定它们的类型。或者,更确切地说,我想知道给定的属性是X还是从X派生的 因此,我使用以下行(与示例类一起使用): 在这里,如果属性是GenericDataObjectWithUniqueID类,或从该类派生,则它将传递if条件 但是对于泛型类,我不能这样做 我的泛型类非常简单,仅此而已:C# 如果属性是泛型类,则获取属性类型,c#,generics,reflection,C#,Generics,Reflection,好的,所以我在我的项目中使用泛型,有时我想遍历类的所有属性并确定它们的类型。或者,更确切地说,我想知道给定的属性是X还是从X派生的 因此,我使用以下行(与示例类一起使用): 在这里,如果属性是GenericDataObjectWithUniqueID类,或从该类派生,则它将传递if条件 但是对于泛型类,我不能这样做 我的泛型类非常简单,仅此而已: public class GenericPrimitiveContainer<T> { private T _value;
public class GenericPrimitiveContainer<T>
{
private T _value;
public T Value
{
get
{
return _value;
}
set
{
_value = value;
}
}
}
事实上,它给出了一个编译错误
所以我试了一下:
if (typeof(GenericPrimitiveContainer<>).IsAssignableFrom(props[i].PropertyType))
if(typeof(GenericPrimitiveContainer).IsAssignableFrom(props[i].PropertyType))
它进行编译,但不捕获有问题的属性
我也可以用这个:
if (typeof(GenericPrimitiveContainer<int>).IsAssignableFrom(props[i].PropertyType))
if(typeof(GenericPrimitiveContainer).IsAssignableFrom(props[i].PropertyType))
这是可行的,但显然一点也不通用
如果可能的话,我想做的是获取它是什么类型,然后获取泛型类型(在本例中为int),然后稍后实例化该类并根据泛型类型为其分配数据
有人能帮忙吗?您必须创建具体的泛型类型,以便检查它是否可以从给定的属性类型分配。我猜您迭代了示例中的所有类型属性,因此这是我针对您的问题的解决方案:
for (int i = 0; i < props.Length; i++)
{
var propertyType = props[i].PropertyType;
if (!propertyType.IsGenericType)
continue;
var genericArgs = propertyType.GetGenericArguments();
var container = typeof(GenericPrimitiveContainer<>);
var containerWithArguments = container.MakeGenericType(genericArgs);
if (containerWithArguments.IsAssignableFrom(propertyType))
// Do something here
}
for(int i=0;i
if (typeof(GenericPrimitiveContainer<>).IsAssignableFrom(props[i].PropertyType))
if (typeof(GenericPrimitiveContainer<int>).IsAssignableFrom(props[i].PropertyType))
for (int i = 0; i < props.Length; i++)
{
var propertyType = props[i].PropertyType;
if (!propertyType.IsGenericType)
continue;
var genericArgs = propertyType.GetGenericArguments();
var container = typeof(GenericPrimitiveContainer<>);
var containerWithArguments = container.MakeGenericType(genericArgs);
if (containerWithArguments.IsAssignableFrom(propertyType))
// Do something here
}