【发布时间】:2016-08-30 12:38:53
【问题描述】:
Type type_class_a = ....;
Type type_class_b = type_class_a.GetField("name_b").FieldType;
MethodInfo method = type_class_b.GetMethod("method");
method.Invoke(type_class_b,new object[] {"test_string"});
在 dll 中
public class class_a
{
public static class_b name_b = new class_b();
}
public class class_b
{
public void method(string data)
{
}
}
但我有错误
在 mscorlib.dll 中发生“System.Reflection.TargetException”类型的未处理异常 附加信息:对象与目标类型不匹配。
那怎么调用呢? 谢谢。
【问题讨论】:
-
method.Invoke的第一个参数应该是class_b的instance,而不是类型。您正在调用一个实例方法 - 您仍然需要一个实例。 -
谢谢你,它工作。
var instance = Activator.CreateInstance(type_class_b); type_class_a.GetField("name_b").SetValue(type_class_a,instance ) -
当您使用 Activator.CreateInstance(...) 创建实例时,会在内存中创建另一个对象。因此,如果您的
class_a的静态成员name_b存储在内存位置0x1234,那么使用Activator.CreateInstance 创建的对象将不是该对象,而是可能存储在内存地址0x9876 的新对象。因此,您可能在使用 Activator.CreateInstance 创建的此对象中的字段和属性值不同;这也将导致大量耗时的调试时间(因为您将无法确定丢失值的位置) -
我不这么认为。 创建实例> 对实例执行任何操作> 将实例设置为字段 和创建实例> 将实例设置为字段> 对实例执行任何操作。结果相同(已测试)-> 相同的内存地址(指针)。
标签: c# reflection system.reflection