Как захватить статическое или нестатическое свойство с помощью лямбда-выражения? - PullRequest
4 голосов
/ 21 декабря 2009

Существует множество преимуществ использования лямбда-выражения для захвата свойства или метода некоторого класса, например, следующего кода.

void CaptureProperty<T, TProperty> (Func<T, TProperty> exp)
{
   // some logic to keep exp variable
}

// So you can use below code to call above method.
CaptureProperty<string, int>(x => x.Length);

Однако приведенный выше код не поддерживает статические свойства. Итак, как создать метод, поддерживающий как статическое, так и нестатическое свойство?

Спасибо

1 Ответ

7 голосов
/ 21 декабря 2009

Ну, вы можете захватить статическое свойство таким образом:

CaptureProperty<string, Encoding>(x => Encoding.UTF8);

Затем вам нужно предоставить "фиктивное" значение во время выполнения ...

Альтернативой может быть предоставление другой перегрузки только с одним аргументом типа:

void CaptureProperty<T>(Func<T> func)
{
    // Whatever
}

Использование выглядит так:

CaptureProperty<Encoding>(() => Encoding.UTF8);

Это то, что вы ищете?

Если вы хотите объединить их внутренне, вы можете иметь «фиктивный» закрытый вложенный тип того же типа, что и CaptureProperty, и реализовать статическую версию следующим образом:

void CaptureProperty<T>(Func<T> func)
{
    CaptureProperty<DummyType, T>(x => func());
}

Тогда вы можете обнаружить, что тип «источника» равен DummyType, когда вам нужно будет вызвать функцию позже. Это может или не может быть полезной идеей в зависимости от того, что еще вы делаете:)

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