Создайте делегат для свойства acessor, полученного путем отражения, когда тип свойства неизвестен - PullRequest
3 голосов
/ 30 августа 2011

В .NET 2.0 (с C # 3.0), как я могу создать делегат для средства доступа к свойству, полученного с помощью отражения, когда я не знаю его тип во время компиляции?

Например, если у меня есть свойствовведите int, я могу сделать это:

Func<int> getter = (Func<int>)Delegate.CreateDelegate(
    typeof(Func<int>),
    this, property.GetGetMethod(true));
Action<int> setter = (Action<int>)Delegate.CreateDelegate(
    typeof(Action<int>),
    this, property.GetSetMethod(true));

, но если я не знаю, к какому типу относится свойство во время компиляции, я не знаю, как это сделать.

1 Ответ

2 голосов
/ 30 августа 2011

Что вам нужно, это:

Delegate getter = Delegate.CreateDelegate(
    typeof(Func<>).MakeGenericType(property.PropertyType), this,
    property.GetGetMethod(true));
Delegate setter = Delegate.CreateDelegate(
    typeof(Action<>).MakeGenericType(property.PropertyType), this,
    property.GetSetMethod(true));

однако, если вы делаете это для повышения производительности, вы все равно собираетесь потерпеть неудачу, поскольку вам нужно будет использовать DynamicInvoke(), то есть slooow . Возможно, вы захотите взглянуть на метапрограммирование, чтобы написать оболочку, которая принимает / возвращает object. Или посмотрите на HyperDescriptor, который делает это за вас.

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