我想寫一個代碼,可以通過lambda表達式設置屬性值。如何避免c#泛型類型將其更改爲基類類型?
「屬性'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型轉換到武器STRING,MemberExpression propertyExp = Expression.Property(targetExp, property);
語句將拋出一個異常「屬性‘System.String名稱’沒有爲類型‘UniTest.weapon’定義」 。
在我看來,用通過武器參數調用SetPropertyValueByLambda<K, V>
方法,K可以是SWORD類型。如果我改變SetPropertyValueByLambda(weapon, "sword", propInfo);
到反射方法:propInfo.SetValue(weapon, "sword", null);
會成功。
那麼我能做些什麼讓上面的代碼可以在lambda表達式.thinks中運行。
順便說一句,我不能將名稱屬性從劍類移動到武器類。
我覺得我感覺不舒服。 – x0n 2011-12-17 19:27:31
你爲什麼決定使用反射? – sq33G 2011-12-17 19:42:57