Нестатический метод требует цели в PropertyInfo.SetValue - PullRequest
5 голосов
/ 26 августа 2010

Хорошо, я изучаю дженерики и пытаюсь заставить эту штуку работать, но она постоянно повторяет мне ту же ошибку.Вот код:

public static T Test<T>(MyClass myClass) where T : MyClass2
{
    var result = default(T);
    var resultType = typeof(T);
    var fromClass = myClass.GetType();
    var toProperties = resultType.GetProperties();

    foreach (var propertyInfo in toProperties)
    {
        var fromProperty = fromClass.GetProperty(propertyInfo.Name);
        if (fromProperty != null)
            propertyInfo.SetValue(result, fromProperty, null );
    }

    return result;
}

Ответы [ 3 ]

8 голосов
/ 26 августа 2010

Это происходит потому, что default(T) возвращает null, поскольку T представляет ссылочный тип. Значения по умолчанию для ссылочных типов: null.

Вы можете изменить свой метод на:

public static T Test<T>(MyClass myClass) where T : MyClass2, new()
{
    var result = new T();
    ...
}

и тогда он будет работать так, как вы хотите. Конечно, MyClass2 и его потомки теперь должны иметь конструктор без параметров.

3 голосов
/ 26 августа 2010

Проблема здесь в том, что T происходит от MyClass и, следовательно, является ссылочным типом. Таким образом, выражение default(T) вернет значение null. Следующий вызов SetValue работает со значением null, но свойство является свойством экземпляра, поэтому вы получаете указанное сообщение.

Вам нужно будет выполнить одно из следующих действий:

  1. Передать реальный экземпляр T в функцию Test, чтобы установить значения свойств на
  2. Установить статические свойства только для типа
1 голос
/ 02 сентября 2011

Вместо

propertyInfo.SetValue(result, fromProperty, null);

попробуйте:

foreach (var propertyInfo in toProperties)  
{ 
    propertyInfo.GetSetMethod().Invoke(MyClass2, new object[] 
    { 
        MyClass.GetType().GetProperty(propertyInfo.Name).
        GetGetMethod().Invoke(MyClass, null)
    });
}
...