Заставить мышь щелкнуть всю область вместо точки

Примечание: Как и мы с Эриком, такой подход не является идиоматическим способом решения таких проблем. Без контекста трудно предложить альтернативные решения, но ... будьте осторожны. Отражения, как правило, лучше всего избегать, если у вас нет настоящей потребности.

Таким образом, возникает ряд проблем.

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 #, а номер раз, когда вы можете решить атаковать проблему с (медленным) отражением, мало и далеко. Есть почти всегда лучшие способы взломать гайку.

0
задан Ugo 18 January 2019 в 18:34
поделиться