You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过反射调用类中指定类型现有实例的方法?

问题:反射调用类中现有实例的指定方法

我想要调用类中指定类型的所有变量/实例的某个方法,已了解可通过反射实现,但找到的示例要么用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);
    }
}

说明

  1. field.GetValue(this)会从当前MyClass对象中取出对应字段的Data实例(也就是已初始化的instance1和instance2)
  2. 拿到现有实例后,直接通过MethodInfo.Invoke调用其Print方法即可,完全不需要创建新实例。

内容的提问来源于stack exchange,提问作者Sayon

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 10:40:18