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
asobject
をボックス化するとFastMember
、値を正しく設定できます。
object person = new PersonStruct();
var accessor = TypeAccessor.Create(person.GetType());
accessor[person, "Name"] = "Foo";
値型のCreateSetter
場合にこのボクシングを処理する方法はありますか?TInstance