如何从程序集中定义的类型获取属性值?

时间:2014-04-24 20:01:41

标签: c# reflection

这是代码(我为了简单起见对其进行了修改):

System.Reflection.Assembly asm = System.Reflection.Assembly.GetExecutingAssembly();
Type t = asm.GetType("OneSubClass");
System.Reflection.PropertyInfo pi = t.GetProperty("SubClassProperty");

在此代码之后,asm是我的应用程序的exe,其中有六个左右的类。

t是exe中其中一个类的类型。

pi填充了类OneSubClass

中属性的属性信息

运行我的应用程序时,它会为exe中定义的所有这些类创建实例。然后执行上面的代码。但是,如何获取属性的实际

如果我尝试这样的话:

pi.GetValue(asm, null);

它给了我异常"对象与目标类型不匹配" - 我需要一个我想要属性的类的实例(我不确定如何获取 - 我只有asm

3 个答案:

答案 0 :(得分:0)

您需要OneSubClass类的实例。类(和类型)本身只是一个模板 - 它没有任何属性的值。该类型的每个实例都有值,您将实例传递给GetValue

pi.GetValue(instanceOfOneSubClass, null);

创建实例的一种方法是使用Activator

object myInstance = Activator.CreateInstance(typeof(OneSubClass));

但这基本上相当于调用new OneSubClass(),所以除非你知道默认构造函数将完全按照你在这里所期望的那样做,否则这并不总是非常有用。

  

运行我的应用程序时,它会为exe中定义的所有这些类创建实例。

我不确定这意味着什么。你是说某个地方已经有一个已创建的实例,你需要以某种方式获得它的处理?

答案 1 :(得分:-1)

t只是一种类型,而不是该类型的实例。

首先必须像这样创建该类型的实例:

object asmInstance = Activator.CreateInstance(t);
然后

获取该实例的值

pi.GetValue(asmInstance, null);

答案 2 :(得分:-2)

您正在尝试从正在实例化的Assembly类中获取属性。要从对象中检索值,您需要对该对象的引用:

object GetValueFromClass(object Class)
{

    System.Reflection.Assembly asm = System.Reflection.Assembly.GetExecutingAssembly();
    Type t = asm.GetType("OneSubClass");
    System.Reflection.PropertyInfo pi = t.GetProperty("SubClassProperty");

    return pi.GetValue(Class, null);

}