使用反射将未知对象转换为泛型类

时间:2019-07-12 09:22:51

标签: c# generics reflection casting

我有一个将对象作为参数的方法。在该方法中,我将通过反射遍历对象的属性。一些属性属于通用类类型。我喜欢读取该通用类属性的属性,但是无法将其强制转换为通用类。

public abstract class BaseClass
{
    public int Id { get; set; }
}

public abstract class GenericClass<T>: BaseClass
{
    public string Description { get; set; }
}

public class DerivedClassA: GenericClass<DerivedClassA>
{
    public string A { get; set; }
}

public class DerivedClassB: GenericClass<DerivedClassB>
{
    public string B { get; set; }
}

public class ReflectingClass: BaseClass
{
    public string Code { get; set; }
    public DerivedClassA DerA { get; set; }
    public DerivedClassB DerB { get; set; }
}

public static void Reflecting(object obj)
{
    var t = GetType(obj)
    foreach (var pi in t.GetProperties())
    {
        if (obj.GetType().BaseType.GetGenericTypeDefinition() == typeof(GenericClass<>)
        {
            var genClassObjProperty = ((GenericClass<T>)obj).Description; // Error, cannot do this at all !!!
        }
    }
}

我想要的是使代码转到属性,无论派生类实际上是什么,都可以获取派生自该类的GenericClass的Description属性。

我使用的是泛型类,因为在代码的其他地方,我通过其派生类调用方法并获得适当的类类型,而无需使用各种类型的强制转换和传递类型。即:

DerivedClassA.DoSomething() 

代替

BaseClass.DoSomething<DerivedClassA>()

BaseClass.DoSomething(type derivedClassType)

1 个答案:

答案 0 :(得分:0)

看看这个:

public static void Reflecting(object obj)
{
    foreach (var pi in obj.GetType().GetProperties())
    {
        if (pi.PropertyType.BaseType.IsGenericType
            && pi.PropertyType.BaseType.GetGenericTypeDefinition()
            == typeof(GenericClass<>))
        {
            var propValue = pi.GetValue(obj);
            if (propValue != null)
            {
                var description = propValue.GetType()
                    .GetProperty("Description").GetValue(propValue);
                Console.WriteLine(description);
            }
        }
    }
    Console.ReadKey();
}

我认为这就是您所需要的。