如何通过反射调用类中指定类型现有实例的方法?
问题:反射调用类中现有实例的指定方法
我想要调用类中指定类型的所有变量/实例的某个方法,已了解可通过反射实现,但找到的示例要么用Activator.CreateInstance()创建新实例,要么仅处理单个实例(用FieldInfo.GetValue())。我希望直接调用现有实例的方法而非创建新实例,这是否可行?
示例代码如下:
public class Data { int x; public Data(int x){ this.x = x; } public void Print() { Console.WriteLine(x); } } public class MyClass { private Data instance1 = new Data(5); private Data instance2 = new Data(4); ... public void PrintAllX(){ var fields = GetType().GetFields(BindingFlags.NonPublic | BindingFlags.Instance).Where(f => f.FieldType == typeof(Data)); foreach(FieldInfo field in fields) { MethodInfo method = field.FieldType.GetMethod("Print"); var instance = ?;// need to get 'Data' instance for each field here (instance1, instance2) method?.Invoke(instance, null); } } }
我曾尝试按照某帖子的建议将instance设为field.GetValue(null),但出现错误:TargetException: Non-static field requires a target。
解决方案
完全可行,你只需要修正获取实例的方式:
错误原因
field.GetValue(null)仅适用于静态字段,而你要获取的是MyClass的实例字段(非static),必须传入当前MyClass的实例(即this)作为参数。
修正后的代码
public void PrintAllX() { var fields = GetType().GetFields(BindingFlags.NonPublic | BindingFlags.Instance) .Where(f => f.FieldType == typeof(Data)); foreach(FieldInfo field in fields) { MethodInfo method = field.FieldType.GetMethod("Print"); // 传入当前MyClass实例this,获取已存在的Data实例 var instance = field.GetValue(this); method?.Invoke(instance, null); } }
说明
field.GetValue(this)会从当前MyClass对象中取出对应字段的Data实例(也就是已初始化的instance1和instance2)- 拿到现有实例后,直接通过
MethodInfo.Invoke调用其Print方法即可,完全不需要创建新实例。
内容的提问来源于stack exchange,提问作者Sayon
相关产品推荐
相关产品推荐

