我有一个将对象作为参数的方法。在该方法中,我将通过反射遍历对象的属性。一些属性属于通用类类型。我喜欢读取该通用类属性的属性,但是无法将其强制转换为通用类。
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)
答案 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();
}
我认为这就是您所需要的。