这是代码(我为了简单起见对其进行了修改):
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
)
答案 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);
}