[英]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.