簡體   English   中英

從 FieldInfo 獲取 Object 個實例

[英]Get Object Instances from FieldInfo

我正在嘗試為我的 class 中給定類型的每個變量/實例調用一個方法。我發現其他帖子描述了使用反射執行此操作的方法。 但是,我發現的示例正在使用Activator.CreateInstance()或僅使用給定 class 的一個實例(使用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);
        }
    }
}

我已經嘗試按照這篇文章中的建議為此將實例設置為field.GetValue(null) ,但它不起作用並給我錯誤: TargetException: Non-static field requires a target

感謝madreflection 的建議,我能夠為我的問題想出一個解決方案。 這是我的問題中示例代碼的解決方案。 請注意,正如他的評論中提到的,使用集合對於后續調用可能更好。 但是,在我的例子中,我只調用一次此方法,因此后續調用的性能不是問題。

public void PrintAllX()
    {

        List<object> fieldObjs = GetType().GetFields(BindingFlags.NonPublic | BindingFlags.Instance).Select(s => s.GetValue(this)).ToList();
        foreach (object obj in fieldObjs)
        {
            if (obj == null) continue;

            if (obj.GetType() == typeof(Data))
                ((Data)obj).Print();
        }
    }

也許我遺漏了一些東西……但反思可能不是這里的正確工具。

與其讓每個Data字段都成為單獨的變量,不如將它們放在一個集合中會怎樣……那么您就可以完全避免反射。

就像是:

public class MyClass {
    private Data instance1 = new Data(5);
    private Data instance2 = new Data(4);

    private List<Data> datas = new List<Data> {
        instance1,
        instance2    // etc...
    };

    public void PrintAllX() {
        foreach(Data data in datas) {
            data.Print();
        }
    }
}

更新:將代碼修改為混合字段變量,其中包含這些字段變量的列表。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM