GetValue返回Object与目标类型不匹配

时间:2014-04-15 14:12:40

标签: c# reflection

已经花了一个小时试图用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;
            }

        }

1 个答案:

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