En passant anonyme de type, comme les paramètres de la méthode

Dans mon architecture de plugin, je suis actuellement en train de passer d'un plugin nom (chaîne de caractères), le nom de la méthode (chaîne de caractères) et les paramètres (tableau d'objets) à mon plugin de service pour exécuter la méthode spécifiée et retourner le résultat (de type T).

Le plugin du service méthode execute peut être vu ci-dessous:

public TResult Execute<TResult>(string pluginName, string operation, params object[] input) {
    MethodInfo method = null;
    TResult result = default(TResult);

    var plugin = _plugins.Enabled().FirstOrDefault(x => x.GetType().Name.Equals(pluginName,  StringComparison.InvariantCultureIgnoreCase));

    if (plugin != null) {
        method = plugin.GetType().GetMethods().FirstOrDefault(x => x.Name == operation);
        if (method != null) {
            result = (TResult)method.Invoke(plugin, input);
        }
    }
    return result;
  }

Un exemple d'utilisation:

var url = AppHelper.PluginService.Execute<string>(
    "ImagePlugin",
    "GetImageUrl",
    new object[] { image, size });

Ce que je préfère faire est de passer d'un type anonyme la place (comme je pense que c'est plus lisible) c'est à dire

var url = AppHelper.PluginService.Execute<string>(
    "ImagePlugin",
    "GetImageUrl",
    new { image = image, targetSize = size });

Comment puis-je modifier ma méthode Execute de la carte de l'anonyme de type de propriétés à mon plugin paramètres de la méthode?

J'avais envisagé d'utiliser le nouveau type dynamique dans .net 4.0, mais je préfère définir mes paramètres sur le plugin méthode plutôt que d'accepter un objet dynamique.

Merci
Ben

[Mise à jour]

Après en regardant à travers la ASP.NET MVC code source, il semble assez simple à tirer de l'anonyme de type dans un objet dictionnaire par exemple RouteValueDictionary.
Avec l'aide de la réflexion, une expression linq est créé dynamiquement. Même si c'est une bonne mise en œuvre, je n'ai pas vraiment envie que tout cela supplémentaire de complexité.

Que par les commentaires ci dessous, je peux atteindre la lisibilité en spécifiant simplement mes paramètres en ligne (pas besoin de l'objet de déclaration de tableau):

var url = AppHelper.PluginService.Execute<string>("ImagePlugin", "GetImageUrl", image, size);
  • Puisque vous utilisez params mot-clé, vous pouvez le faire image, size au lieu de new object[] { image, size }. Il serait de la rendre plus lisible, et depuis Invoke méthodes accepte tableau d'objet, je laisse la signature de la méthode telle qu'elle est.
InformationsquelleAutor Ben Foster | 2010-08-08