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

Я пытаюсь использовать рефлексию, чтобы получить все (настраиваемые) свойства в моем POCO (которые пока принимают строковый аргумент, но я планирую расширяться до других типов), и установить их в произвольное значение. (Мне нужно убедиться, что метод .Equals реализован правильно.)

У меня есть код в моих модульных тестах, который выглядит примерно так (где t - тестируемый объект, а u - версия этого объекта по умолчанию):

foreach(var property in t.GetType().GetProperties())
{
    var setMethod = property.GetSetMethod();
    var type = setMethod.GetParameters()[0].GetType();
    if(typeof(string).IsAssignableFrom(type))
    {
        setMethod.Invoke(t, new object[] {"a"});
        Assert.IsFalse(t.Equals(u));
        Assert.IsFalse(t.GetHashCode() == u.GetHashCode());
    }                    
}

Место, где это терпит неудачу, - это место, где я говорю typeof(string).IsAssignableFrom(type). Код внутри блока if { ... } никогда не запускается. Как бы я правильно запрограммировал эту часть теста?

1 Ответ

4 голосов
/ 12 октября 2010

Вы перепутали ParameterInfo.GetType() с ParameterInfo.ParameterType. Вы должны иметь:

var type = setMethod.GetParameters()[0].ParameterType;

.GetType() возвращает тип текущего объекта, в данном случае ParameterInfo, что явно не то, что вам нужно.

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