反射:在静态字段中调用方法
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 中)
- 在您的代码中获取
class_a
个对象的 Type
(存储在 Type
类型的 class_a_type
变量中)
- 为
name_b
对象获取class_a_type
对象的FieldInfo
对象(将其存储在a_field_info
类型为FieldInfo
的变量中)
- 通过调用
FieldInfo
对象的 GetValue 函数(将其存储在 b_object
变量中),在对象中获取该字段类型的对象(在您的例子中,对象实例 name_b
)类型 object
)
- 通过调用
b_object.GetType().GetMethod("method")
获取上述b_object
对象中方法(名为method
)的MethodInfo
对象(并将其存储在b_method
对象中类型 MethodInfo
)
- 通过在上述
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);
希望对您有所帮助!
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 中)
- 在您的代码中获取
class_a
个对象的Type
(存储在Type
类型的class_a_type
变量中) - 为
name_b
对象获取class_a_type
对象的FieldInfo
对象(将其存储在a_field_info
类型为FieldInfo
的变量中) - 通过调用
FieldInfo
对象的 GetValue 函数(将其存储在b_object
变量中),在对象中获取该字段类型的对象(在您的例子中,对象实例name_b
)类型object
) - 通过调用
b_object.GetType().GetMethod("method")
获取上述b_object
对象中方法(名为method
)的MethodInfo
对象(并将其存储在b_method
对象中类型MethodInfo
) - 通过在上述
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);
希望对您有所帮助!