繁体   English   中英

C#在循环中访问嵌套类的属性

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

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM