2010-10-01 12 views
11

Aquí es el contexto:La invocación de un método de una clase genérica

trato de codificar un mapeador para convertir mis objetos modelo de dominio a ViewModel oyectos de forma dinámica. El problema que tengo, es cuando trato de invocar un método de clase genérica por reflexión Obtengo este error:

System.InvalidOperationException: Las operaciones de límite tardío no se pueden realizar en los tipos o métodos para los que ContainsGenericParameters es verdadero.

¿Alguien puede ayudarme a averiguar dónde está la falla? Se agradecería enormemente

Aquí está el código (Traté de lo simplificó):

public class MapClass<SourceType, DestinationType> 
{ 

    public string Test() 
    { 
     return test 
    } 

    public void MapClassReflection(SourceType source, ref DestinationType destination) 
    { 
     Type sourceType = source.GetType(); 
     Type destinationType = destination.GetType(); 

     foreach (PropertyInfo sourceProperty in sourceType.GetProperties()) 
     { 
      string destinationPropertyName = LookupForPropertyInDestinationType(sourceProperty.Name, destinationType); 

      if (destinationPropertyName != null) 
      { 
       PropertyInfo destinationProperty = destinationType.GetProperty(destinationPropertyName); 
       if (destinationProperty.PropertyType == sourceProperty.PropertyType) 
       { 
        destinationProperty.SetValue(destination, sourceProperty.GetValue(source, null), null); 
       } 
       else 
       { 

         Type d1 = typeof(MapClass<,>); 
         Type[] typeArgs = { destinationProperty.GetType(), sourceType.GetType() }; 
         Type constructed = d1.MakeGenericType(typeArgs); 

         object o = Activator.CreateInstance(constructed, null); 

         MethodInfo theMethod = d1.GetMethod("Test"); 

         string toto = (string)theMethod.Invoke(o,null); 

       } 
       } 
      } 
     } 


    private string LookupForPropertyInDestinationType(string sourcePropertyName, Type destinationType) 
    { 
     foreach (PropertyInfo property in destinationType.GetProperties()) 
     { 
      if (property.Name == sourcePropertyName) 
      { 
       return sourcePropertyName; 
      } 
     } 
     return null; 
    } 
} 
+0

@usr "invocar un método de una clase genérica" ​​es diferente con "invocar un método genérico de una clase", la respuesta aquí no puede resolver la pregunta. –

+0

@MasonZhang reabierto. – usr

Respuesta

16

es necesario llamar a GetMethod en el tipo construido constructed, no en la definición de tipo d1.

+0

Gracias! Funciona – dervlap

Cuestiones relacionadas