Могу ли я вызвать prop.setValue в одну строку? - PullRequest
0 голосов
/ 08 января 2020

Можно ли вызвать этот метод setvalue () в одну строку?

var genderProp = inj.GetType().GetProperty("gender");
genderProp.SetValue(inj, Enum.Parse(genderProp.PropertyType, "Male"), null);

Ответы [ 2 ]

1 голос
/ 08 января 2020

Если вы идете за одним утверждением, но по-прежнему пытаетесь не вызывать GetProperty дважды, вы можете использовать C# вариант IIFE

((Action<PropertyInfo, object>)
   ((genderProp,x) => 
         genderProp.SetValue(x, Enum.Parse(genderProp.PropertyType, "Male"), null)))
    (inj.GetType().GetProperty("gender"), inj);

Я бы не рекомендовал делать это в реальный код, но несколько полезный метод, если вы хотите, чтобы некоторые сложные операторы повторно использовали один и тот же параметр в LINQPad, например.

Для реального кода рассмотрим dynamic - который будет правильно обрабатывать все отражения (включая необходимое кэширование):

  ((dynamic)inj).gender =  Enum.Parse(genderProp.PropertyType, "Male");
1 голос
/ 08 января 2020

Вы можете сделать следующее, но не знаете, как это поможет сделать код более читабельным.

inj.GetType().GetProperty("gender").SetValue(inj, Enum.Parse(inj.GetType().GetProperty("gender").PropertyType, "Male"), null);

Альтернативный подход будет

inj.GetType().InvokeMember("gender",
    BindingFlags.Instance | BindingFlags.Public | BindingFlags.SetProperty,
    Type.DefaultBinder, inj, new[]{Enum.Parse(inj.GetType().GetProperty("gender").PropertyType, "Male")});

Лично я бы предпочитаю двухстрочный код.

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