2010-08-26 10 views
5

Ok, entonces estoy aprendiendo acerca de los genéricos y estoy tratando de hacer que esto funcione, pero me sigue diciendo el mismo error. Aquí está el código:El método no estático requiere un objetivo en PropertyInfo.SetValue

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; 
} 

Respuesta

8

Esto ocurre porque default(T) devuelve null porque T representa un tipo de referencia. Los valores predeterminados para los tipos de referencia son null.

Usted puede cambiar su método a:

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

y entonces todo funcionará como se desea. Por supuesto, MyClass2 y sus descendientes deben tener ahora un constructor sin parámetros.

+0

Gracias, eso era justo lo que estaba buscando ... –

3

El problema aquí es que T deriva de MyClass y es por lo tanto un tipo de referencia. Por lo tanto, la expresión default(T) devolverá el valor null. La siguiente llamada a SetValue está operando un valor de null, pero la propiedad es una propiedad de instancia, por lo tanto, obtiene el mensaje especificado.

Usted tendrá que hacer una de las siguientes

  1. Pasar una verdadera instancia de T a la función de prueba para establecer los valores de las propiedades en
  2. establecer Sólo las propiedades estáticas del tipo
1

En lugar de

propertyInfo.SetValue(result, fromProperty, null); 

intento:

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