[英]C# Accessing a property of nested classes in a loop
我試圖在循環時通過反射來訪問嵌套類的屬性,但是找不到這樣做的方法。 我對JavaScript的了解比對C#的了解要多得多,因此我將用JS術語解釋我的問題,並展示我對C#所做的嘗試。
我要使用JavaScript來完成的工作:
var myObj = {
prop1: {p1: 0, p2: 1, p3: 2},
prop2: {p1: 0, p2: 2, p3: 4},
prop3: {p1: 0, p2: 4, p3: 8}
};
console.log(myObj.prop2.p2); //2
for( prop in myObj ) {
//Since I know the inner properties are the same
myObj[prop].p1++;
myObj[prop].p2++;
myObj[prop].p3++;
}
console.log(myObj.prop2.p2); //3
這是我在C#中嘗試過的方法,但是沒有運氣:
class myObj
{
public class myPropObj
{
public int p1 {get; set;}
public int p2 {get; set;}
public int p3 {get; set;}
public myPropObj(int one, int two, int three)
{
p1 = one;
p2 = two;
p3 = three;
}
}
public myPropObj prop1 = new myPropObj(0, 1, 2);
public myPropObj prop2 = new myPropObj(0, 2, 4);
public myPropObj prop3 = new myPropObj(0, 4, 8);
}
--------------------------------------------------------------
//Not working
myObj myObject = new myObj();
Console.WriteLine(myObject.prop2.p2); //2
foreach( var prop in typeof(myObject).GetProperties() )
{
//I am thinking I need to cast it to the same type as nested class, but unsure how to do this
((myObject.myPropObj)prop).p1++;
((myObject.myPropObj)prop).p2++;
((myObject.myPropObj)prop).p3++;
}
Console.WriteLine(myObj.prop2.p2); //3
非常感謝您抽出寶貴的時間來幫助我。
注意 : 正如我和Eric都指出的那樣,采用這種方法並不是解決此類問題的慣用方法。 沒有上下文,很難提出其他解決方案,但是……要當心。 除非您有真正的需求,否則通常最好避免反射。
有很多問題。
1)C#准則要求為類名稱使用CapitalCamelCase
。 我將在這個答案中做到這一點。
2) public MyPropObj prop1 = new MyPropObj(0, 1, 2);
這不是財產。 這是一個字段,因此GetProperties()
不會選擇它。 C#指南建議不要使用公共字段,因此最好的方法是改為使用公共屬性:
public MyPropObj prop1 { get; set; } = new MyPropObj(0, 1, 2);
等等...
3)在Type
上調用GetProperties
返回一個PropertyInfo
數組。 這些依次提供了GetValue
方法,可以調用該方法來獲取屬性的值:
var obj = prop.GetValue(myObject); //this is always of type Object
var propObj = (MyObj.MyPropObj)obj; //so we need to cast it
現在我們可以將propObj
和
propObj.p1++;
propObj.p2++;
propObj.p3++;
像平常一樣。 您不需要為此部分進行反思。
全部放在一起:
void Main()
{
MyObj myObject = new MyObj();
Console.WriteLine(myObject.prop2.p2); //2
foreach (var prop in typeof(MyObj).GetProperties())
{
var propObj = (MyObj.MyPropObj)prop.GetValue(myObject);
propObj.p1++;
propObj.p2++;
propObj.p3++;
}
Console.WriteLine(myObject.prop2.p2); //3
}
class MyObj
{
public class MyPropObj
{
public int p1 { get; set; }
public int p2 { get; set; }
public int p3 { get; set; }
public MyPropObj(int one, int two, int three)
{
p1 = one;
p2 = two;
p3 = three;
}
}
public MyPropObj prop1 { get; set; } = new MyPropObj(0, 1, 2);
public MyPropObj prop2 { get; set; } = new MyPropObj(0, 2, 4);
public MyPropObj prop3 { get; set; } = new MyPropObj(0, 4, 8);
}
但是 ,這不是慣用的C#,並且您可能選擇以(緩慢)反射來解決問題的次數很少。 幾乎總有更好的方法來破解螺母。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.