C# 如果属性是泛型类,则获取属性类型

C# 如果属性是泛型类,则获取属性类型,c#,generics,reflection,C#,Generics,Reflection,好的,所以我在我的项目中使用泛型,有时我想遍历类的所有属性并确定它们的类型。或者,更确切地说,我想知道给定的属性是X还是从X派生的 因此,我使用以下行(与示例类一起使用): 在这里,如果属性是GenericDataObjectWithUniqueID类,或从该类派生,则它将传递if条件 但是对于泛型类,我不能这样做 我的泛型类非常简单,仅此而已: public class GenericPrimitiveContainer<T> { private T _value;

好的,所以我在我的项目中使用泛型,有时我想遍历类的所有属性并确定它们的类型。或者,更确切地说,我想知道给定的属性是X还是从X派生的

因此,我使用以下行(与示例类一起使用):

在这里,如果属性是GenericDataObjectWithUniqueID类,或从该类派生,则它将传递if条件

但是对于泛型类,我不能这样做

我的泛型类非常简单,仅此而已:

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
}