Примечание: Как и мы с Эриком, такой подход не является идиоматическим способом решения таких проблем. Без контекста трудно предложить альтернативные решения, но ... будьте осторожны. Отражения, как правило, лучше всего избегать, если у вас нет настоящей потребности.
Таким образом, возникает ряд проблем.
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) Вызов GetProperties
на Type
возвращает массив из 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 #, а номер раз, когда вы можете решить атаковать проблему с (медленным) отражением, мало и далеко. Есть почти всегда лучшие способы взломать гайку.