如果属性是通用类,则获取属性类型

时间:2018-10-02 17:45:27

标签: c# generics reflection

好的,所以我在项目中使用泛型,有时我想遍历类的所有属性并确定其类型。或者,更确切地说,我想知道给定的属性是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>

有人可以帮忙吗?

1 个答案:

答案 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
}