Простейший C # код для опроса собственности? - PullRequest
3 голосов
/ 07 июля 2011

Я хотел бы знать простейший код для опроса значения свойства, чтобы выполнить код в его получателе.
В настоящее время я использую: instance.property.ToString();, но я бы предпочел что-то без возможных побочных эффектовили ненужные накладные расходы.

Ответы [ 8 ]

15 голосов
/ 07 июля 2011

(я предполагаю, что вы пытаетесь избежать предупреждения, которое вы получаете от простого присвоения значения неиспользуемой переменной.)

Вы можете написать метод расширения без операции:

public static void NoOp<T>(this T value)
{
    // Do nothing.
}

Тогда звоните:

instance.SomeProperty.NoOp();

Это не будет упаковывать значение или касаться его - просто вызовите получатель. Еще одним преимуществом этого по сравнению с ToString является то, что он не сработает, если значение является нулевой ссылкой.

потребует JIT-компиляции метода один раз для каждого типа значения, но это довольно небольшие затраты ...

5 голосов
/ 07 июля 2011

Для меня это звучит как ужасная идея. Честно говоря, если у вас есть логика в геттере, которую нужно регулярно выполнять, выньте ее из геттера и вставьте в метод. Я не хотел бы прыгать и поддерживать подобный код, и как только я наконец понял, почему делает то, что он делает, я бы его рефакторинг.

3 голосов
/ 07 июля 2011

Я бы извлек код из получателя в функцию и вызвал бы функцию как из получателя, так и из вашего опроса, если это вариант для вас.

0 голосов
/ 10 августа 2011

Несмотря на то, что это, вероятно, все еще плохая идея, я просто хочу оставить это краткое лямбда-решение:

((Func< [TYPE_OF_PROPERTY] >)(() => instance.Property))();
0 голосов
/ 07 июля 2011

Я думаю, что вам нужно переместить код в другое место. Поэтому попробуйте установить глобальную переменную в конструкторе вашего объекта 'instance'.

OR .. (не уверен, что вы подразумеваете под глобальной переменной), но если он находится в объекте, вы можете просто получить получатель свойства вашего глобального объекта, чтобы выполнить отложенную загрузку и получить значение.

string _myProp;
public string MyProp
{ 
   get
   {
     if (String.IsNullOrWhiteSpace(_myProp))
     {
        _myProp =  GetTheValueFromWhereEver();
     }
     return _myProp;
   }
}

(но, вероятно, у вас нет доступа к «экземпляру»)

0 голосов
/ 07 июля 2011

Мне нравится ответ Джона Скита, но в том же духе, это также будет работать без написания метода расширения:

GC.KeepAlive(instance.SomeProperty);

Метод KeepAlive принимает object и ничего с ним не делает, как и метод расширения NoOp.

0 голосов
/ 07 июля 2011

Надеюсь, я правильно понял. Прежде всего

class MyClass
{
   public int Number{get;set;}
}

var cl = new MyClass();
cl.Number.ToString();

ToString () не обязательно возвращает значение, для примитивов это так, да, но для других более сложных классов это обычно только полное имя. И я думаю, это не то, что вы хотите.

Чтобы выполнить геттер, вам нужно немного отражения.

var propInfo = this.GetType().GetProperty("Number");
int val = (int)propInfo.GetValue(cl, null);
0 голосов
/ 07 июля 2011

Захватить его в переменную - лучший способ - не вызывает никаких побочных эффектов, если только сам геттер не вызывает побочных эффектов.

var value = someObj.Property;

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...