Invocation d’une méthode d’une classe générique

Voici le contexte:

J’essaie de coder un mappeur pour convertir mes objects DomainModel en ViewModel Ojects de manière dynamic. Le problème que j’ai, c’est quand j’essaie d’invoquer une méthode de classe générique par reflection j’obtiens cette erreur:

System.InvalidOperationException: les opérations liées tardives ne peuvent pas être effectuées sur des types ou des méthodes pour lesquels ContainsGenericParameters est true.

Quelqu’un peut-il m’aider à trouver où est la faute? Ce serait vivement apprécié

Voici le code (j’ai essayé de le simplifier):

public class MapClass { public ssortingng 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()) { ssortingng 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"); ssortingng toto = (ssortingng)theMethod.Invoke(o,null); } } } } private ssortingng LookupForPropertyInDestinationType(ssortingng sourcePropertyName, Type destinationType) { foreach (PropertyInfo property in destinationType.GetProperties()) { if (property.Name == sourcePropertyName) { return sourcePropertyName; } } return null; } } 

Vous devez appeler GetMethod sur le type constructed , et non sur la définition de type d1 .

 // ... Type d1 = typeof(MapClass<,>); Type[] typeArgs = { destinationProperty.GetType(), sourceType.GetType() }; Type constructed = d1.MakeGenericType(typeArgs); object o = Activator.CreateInstance(constructed, null); MethodInfo theMethod = constructed.GetMethod("Test"); ssortingng toto = (ssortingng)theMethod.Invoke(o, null); // ...