【问题标题】:Reflection: invoke method inside static field反射:在静态字段中调用方法
【发布时间】: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_binstance,而不是类型。您正在调用一个实例方法 - 您仍然需要一个实例。
  • 谢谢你,它工作。 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


【解决方案1】:

由于您的类class_a 定义了class_b 类型的对象,并且class_b 包含一个名为method 的方法,因此您的方法如下(在dll 中)

  1. 在您的代码中获取class_a 对象的Type(存储在class_a_type 类型的Type 变量中)
  2. name_b对象获取class_a_type对象的FieldInfo对象(将其存储在a_field_info类型为FieldInfo的变量中)
  3. 通过调用FieldInfo对象的GetValue函数在对象中获取该字段类型的对象(在您的情况下为对象实例name_b)(将其存储在b_object类型的变量object中)李>
  4. 通过调用b_object.GetType().GetMethod("method")获取上述b_object对象中方法的MethodInfo对象(命名为method)(并将其存储在b_method类型为MethodInfo的对象中)
  5. 通过在上述b_method 对象上调用Invoke 函数并将b_object 作为第一个参数(调用函数的对象)和null 作为第二个参数(参数数组)来调用该方法传递给函数。

有点混乱???请看下面的例子:

Type class_a_type = class_a_object.GetType();
FieldInfo a_field_info = class_a_type.GetField("name_b");

object b_object = a_field_info.GetValue(class_a_object);
MethodInfo b_method = b_object.GetType().GetMethod("method");

b_method.Invoke(b_object, null);

希望有帮助!

【讨论】:

    【解决方案2】:

    获取name_b的FieldInfo后,需要调用FieldInfo.GetValue(null)获取实际值(class_b的实例)。您还需要 typeof(class_b).method 的 MethodInfo。

    一旦你拥有了这两个,你就可以调用 methodInfo.Invoke 并传入 class_b 的实例。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-08-08
      • 1970-01-01
      • 1970-01-01
      • 2017-11-28
      • 2014-05-20
      相关资源
      最近更新 更多