У меня есть следующий метод, который устанавливает значение для данного PropertyInfo
по заданному TInstance
. Это делается для того, чтобы избежать неэффективности отражения.Могу ли я установить свойство структуры с помощью выражений?
public static Action<TInstance, object> CreateSetter<TInstance>(PropertyInfo propertyInfo, bool includeNonPublic = false)
{
var setMethod = propertyInfo.GetSetMethod(includeNonPublic);
var instance = Expression.Parameter(typeof(TInstance), "instance");
var value = Expression.Parameter(typeof(object), "value");
var valueCast = !propertyInfo.PropertyType.IsValueType
? Expression.TypeAs(value, propertyInfo.PropertyType)
: Expression.Convert(value, propertyInfo.PropertyType);
return Expression.Lambda<Action<TInstance, object>>(
Expression.Call(instance, setMethod, valueCast), instance, value).Compile();
}
Поэтому, учитывая следующую модель:
public sealed class PersonClass
{
public string Name {get; set;}
}
Я могу установить Name
с помощью:
var person = new PersonClass();
var nameProp = person.GetType().GetProperties().Where(p => p.Name == "Name").First();
var nameSetter = CreateSetter<PersonClass>(nameProp);
nameSetter(person, "Foo");
Это все хорошо, однако, если бы я попробовать метод с struct
например:
public struct PersonStruct
{
public string Name {get; set;}
}
Имя всегда null
. Я подозреваю, что бокс/распаковка меня как-то кусает.
В самом деле, если я использую FastMember
такое же поведение экспозиции при использовании:
PersonStruct person = new PersonStruct();
var accessor = TypeAccessor.Create(person.GetType());
accessor[person, "Name"] = "Foo";
Однако когда я ящике person
, как object
затем FastMember
может правильно установить значение:
object person = new PersonStruct();
var accessor = TypeAccessor.Create(person.GetType());
accessor[person, "Name"] = "Foo";
Любой идеи, как я могу справиться с этим боксом внутри CreateSetter
, когда TInstance
является типом значений?
Компиляция такого выражения, скорее всего, будет * более дорогим, чем отражение, в большинстве контекстов. – Servy
Боковое примечание: только некоторые чтения - http://stackoverflow.com/questions/441309/why-are-mutable-structs-evil –
Структуры передаются по значению. Поэтому, когда вы передаете «sturct» в действие, копия этой структуры передается. Думаю, вам нужен способ пройти по ссылке. –