反射:在静态字段中调用方法

Reflection: invoke method inside static field

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' 类型的未处理异常 附加信息:对象与目标类型不匹配。

那怎么调用呢? 谢谢。

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

的 MethodInfo

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

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

  1. 在您的代码中获取 class_a 个对象的 Type(存储在 Type 类型的 class_a_type 变量中)
  2. name_b对象获取class_a_type对象的FieldInfo对象(将其存储在a_field_info类型为FieldInfo的变量中)
  3. 通过调用 FieldInfo 对象的 GetValue 函数(将其存储在 b_object 变量中),在对象中获取该字段类型的对象(在您的例子中,对象实例 name_b)类型 object)
  4. 通过调用b_object.GetType().GetMethod("method")获取上述b_object对象中方法(名为method)的MethodInfo对象(并将其存储在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);

希望对您有所帮助!