已经花了一个小时试图用GetValue解决问题,而GetValue总是返回
“GetValue return Object does not match target type
”。
我需要从子类中读取API抽象属性值,有什么建议怎么做?
课程
Parent
public abstract partial class EntityBase
{
public abstract int Api { get; }
}
Child
public sealed class Email2Pdf : EntityBase
{
public override int Api
{
get { return 12; }
}
}
提供异常的实际代码
var subClasses = typeof(EntityBase).GetSubClasses(true);
foreach (var subClass in subClasses)
{
//I always get exception here!!!
var value = subClass.GetProperty("Api", BindingFlags.Instance | BindingFlags.Public).GetValue(subClass, null);
}
public static class TypeExtensions
{
public static List<Type> GetSubClasses(this Type baseType, bool topMostOnly = false)
{
var subClasses = baseType.Assembly.GetTypes().Where(type => type.IsSubclassOf(baseType)).ToList();
if (topMostOnly)
{
subClasses.RemoveAll(subClass => subClass.IsAbstract);
}
return subClasses;
}
}
答案 0 :(得分:2)
GetValue
的第一个参数是获取属性值的对象。您正在传递System.Type
类的实例,因此错误。您需要传递关联类型的实例。
假设每个子类都有一个默认构造函数,你可以用Activator.CreateInstance创建一个,例如。
foreach (var subClass in subClasses)
{
var instance = (EntityBase)Activator.CreateInstance(subClass);
var value = subClass.GetProperty("Api", BindingFlags.Instance | BindingFlags.Public).GetValue(instance, null);
}