2010-06-17 9 views
0

Une méthode générique est définie comme suit:Dynamiquement trouver le paramètre à passer comme <T> à une méthode générique

private static T GetComparisonObject<T>(ComparisonAttribute attribute, object objectToParse) 
    { 

     // Perform a some action 
     return (T)resultObject; 
    } 

La méthode est invoquée comme suit:

var srcObjectToCompare = GetComparisonObject<DynamicType>(attributeToCompare, srcObject); 

Le type pour lequel la la méthode doit être appelée est configurée dans le fichier de configuration comme:

Le jeton est passé en <> car les méthodes génériques doivent être le type pour lequel la méthode est invoquée. À partir de la configuration de clé de type dans le fichier XML, une instance de type représentant le type peut être créée {i.e. Type.GetType ("System.Int32")}, mais comment générer la définition de type qui peut ensuite être passée à la méthode générique?

Espérons que je ne manque pas quelque chose d'élémentaire ici !! : -O

Merci d'avance.

Répondre

3

Appel de méthode générique utilisant la réflexion

MethodInfo method = typeof(YourClass).GetMethod("GetComparisonObject"); 
MethodInfo generic = method.MakeGenericMethod(GenericArgumentType); 
Object retVal = generic.Invoke(this, new object[] { attribute, parseObject }); 
+0

gars Merci! Comme vous avez pu le remarquer, le type de retour de la méthode est "générique", donc appeler cette méthode en utilisant Reflection pour revenir à "object" bat un peu le but de la méthode donnée étant générique. Je vais essayer une autre approche pour la sécurité des types, mais cela répond à ma question. – Codex

1

Vous devez utiliser la réflexion:

Type runtimeType = //get the type 
MethodInfo method = typeof(MyClass).GetMethod("GetComparisonObject").MakeGenericMethod(runtimeType); 
object returnValue = method.Invoke(null, new object[] { attribute, parseObject }); 

Cependant, il est important de noter que cette approche jette toute la valeur des génériques. Comme vous pouvez le voir ci-dessus, le résultat de l'invocation de la méthode est un object, et puisque nous ne connaissons pas le type à la compilation, nous ne pouvons pas obtenir de vérification de type. Si vous ne connaissez pas le type au moment de la compilation, il ne sert à rien d'utiliser une méthode générique.