Как избежать, чтобы c # универсальный тип изменил его на базовый тип? - PullRequest
0 голосов
/ 17 декабря 2011

Я пытаюсь написать код, который может установить значение свойства через лямбда-выражение.

«Свойство 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.

1 Ответ

1 голос
/ 17 декабря 2011

Проблема заключается в коде вашей реализации:

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)

Переменная «оружие» имеет тип «оружие», которая не определяет свойство имени.Если вам нужен меч, тогда используйте меч.

sword 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)

Я понимаю, что это не решит вашу проблему, но основная проблема здесь - ваша объектная модель.Если вам нужно в общем взаимодействовать с вашими объектами, тогда им нужно использовать общий интерфейс, который определяет свойства / методы, которые вы хотите быть доступными.

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