使用反射从覆盖中获取价值

问题描述

我想从继承的类的虚拟属性获取值,请参见下面的代码

基类:

public class TestBaseClass
{
   public virtual int Index { get; }
}

继承的类:

public class TestInheritedClass : TestBaseClass
{
   public override int Index => 100; // I want to get this value using reflection
}

我的代码

static void Main(string[] args) 
{
   var assemblies = Assembly.LoadFile(args[0]);
   foreach(var type in assembly.ExportedTypes)
   {
      if(type.IsSubclassOf(typeof(TestBaseClass))
      {
         foreach(var prop in type.GetProperties(BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly)
         {
            var value = prop.GetValue(typeof(int),null); // I expect to return 100 from override Index value
         }
      }
   }
}

我错过了什么吗?还是我把这一切弄错了?我正在尝试从虚拟属性获取100。有没有办法获得价值?

解决方法

有没有办法获得价值?

是的,有办法。 首先让我们看看您在这里做了什么:

prop.GetValue(typeof(int),null)

您正在使用PropertyInfo.GetValue的{​​{3}}重载。它期望从中获取值的对象实例作为第一个参数。相反,您正在传递typeof(int)。这不是TestInheritedClass的实例。 在这里,我将忽略第二个参数,因为我们不是在谈论索引器。 您可以在文档中了解该参数。

相反,您必须首先创建TestInheritedClass的实例:

var instance = Activator.CreateInstance(typeof(TestInheritedClass));

然后像这样使用它:

if (type.IsSubclassOf(typeof(TestBaseClass))
{
    var instance = Activator.CreateInstance(type);

    foreach (var prop in type.GetProperties(BindingFlags.Public | BindingFlags.Instance)
    {
       var value = prop.GetValue(instance);
    }
}