Я пытаюсь написать код, который может установить значение свойства через лямбда-выражение.
«Свойство System.String Name» не определено для исключения типа «UniTest.weapon».
public abstract class weapon{}
public class sword:weapon
{
public string Name
{
get;set;
}
}
public static void SetPropertyValueByLambda<K, V>(K obj,V value,PropertyInfo property)
{
ParameterExpression targetExp = Expression.Parameter(typeof(K), "target");
ParameterExpression valueExp = Expression.Parameter(typeof(V), "value");
MemberExpression propertyExp = Expression.Property(targetExp, property);
BinaryExpression assignExp = Expression.Assign(propertyExp, valueExp);
Action<K, V> active = Expression.Lambda<Action<K, V>>
(assignExp, targetExp, valueExp).Compile();
active(obj, value);
}
weapon weapon = new sword();
PropertyInfo propInfo = typeof(sword).GetProperties().Where(K => K.Name == "Name").ToList()[0];
//set value to object
SetPropertyValueByLambda(weapon, "sword", propInfo);
//propInfo.SetValue(weapon, "sword", null);(reflection)
Когда я вызываю метод SetPropertyValueByLambda, тип K, V преобразуется в WEAPON и STRING, оператор MemberExpression propertyExp = Expression.Property(targetExp, property);
выдает «Свойство System.String Name», не определенное для исключения типа «UniTest.weapon».
На мой взгляд, вызовите метод SetPropertyValueByLambda<K, V>
cand с передачей параметра оружия, K может быть типа SWORD. Если я изменю SetPropertyValueByLambda(weapon, "sword", propInfo);
на метод Reflection: propInfo.SetValue(weapon, "sword", null);
will can success.
так что я могу сделать, чтобы приведенный выше код мог выполняться в лямбда-выражении. Thinks.
Кстати, я не могу переместить свойство Name в класс Weapon из класса Sword.