Есть ли способ создать делегата для получения и установки значений FieldInfo?C#

Место общения программистов C#
Ответить
Anonymous
 Есть ли способ создать делегата для получения и установки значений FieldInfo?

Сообщение Anonymous »

Для свойств есть GetGetMethod и GetSetMethod, поэтому я могу сделать:

Код: Выделить всё

Getter = (Func)Delegate.CreateDelegate(typeof(Func),
propertyInfo.GetGetMethod());
и

Код: Выделить всё

Setter = (Action)Delegate.CreateDelegate(typeof(Action),
propertyInfo.GetSetMethod());
Но как мне быть с FieldInfo?

Я не ищу делегатов для GetValue и SetValue (это означает, что я буду каждый раз вызывать отражение)

Код: Выделить всё

Getter = s => (T)fieldInfo.GetValue(s);
Setter = (s, t) => (T)fieldInfo.SetValue(s, t);
а есть ли здесь подход CreateDelegate? Я имею в виду, что, поскольку назначения возвращают значение, могу ли я рассматривать назначения как метод? Если да, то существует ли для него дескриптор MethodInfo? Другими словами, как мне передать правильный MethodInfo для настройки и получения значения из поля-члена в метод CreateDelegate, чтобы я получил обратно делегата, с помощью которого я могу читать и записывать в поля напрямую?

Код: Выделить всё

Getter = (Func)Delegate.CreateDelegate(typeof(Func), fieldInfo.??);
Setter = (Action)Delegate.CreateDelegate(typeof(Action), fieldInfo.??);
Я могу построить выражение и скомпилировать его, но я ищу что-то попроще. В конце концов, я не против пойти по пути выражения, если на заданный вопрос нет ответа, как показано ниже:

Код: Выделить всё

var instExp = Expression.Parameter(typeof(S));
var fieldExp = Expression.Field(instExp, fieldInfo);
Getter = Expression.Lambda(fieldExp, instExp).Compile();
if (!fieldInfo.IsInitOnly)
{
var valueExp = Expression.Parameter(typeof(T));
Setter = Expression.Lambda(Expression.Assign(fieldExp, valueExp), instExp, valueExp).Compile();
}
Или я гонюсь за несуществующим (поскольку ничего подобного я еще нигде не видел) ?

Подробнее здесь: https://stackoverflow.com/questions/160 ... -fieldinfo
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»