Nella mia architettura di plugin sto passando un nome di plugin (stringa), nome del metodo (stringa) e parametri (array di oggetti) al mio servizio di plugin per eseguire il metodo specificato e restituire il risultato (di tipo T).Passaggio di tipo anonimo come parametri del metodo
metodo di esecuzione del servizio di plugin può essere visto sotto:
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 esempio d'uso:
var url = AppHelper.PluginService.Execute<string>(
"ImagePlugin",
"GetImageUrl",
new object[] { image, size });
Quello che vorrei fare è passare in un tipo anonimo, invece (come credo che questo sia più leggibile) vale a dire
var url = AppHelper.PluginService.Execute<string>(
"ImagePlugin",
"GetImageUrl",
new { image = image, targetSize = size });
Come si modifica il metodo Execute per mappare l'anonimo t proprietà ype ai miei parametri del metodo plugin?
Avevo preso in considerazione l'utilizzo del nuovo tipo dinamico in .net 4.0 ma preferisco definire i miei parametri sul metodo plugin piuttosto che accettare un oggetto dinamico.
Grazie Ben
[Update]
Dopo aver guardato attraverso il codice sorgente di ASP.NET MVC sembra abbastanza semplice per tirare il tipo anonimo in un dizionario oggetti per esempio RouteValueDictionary. Con l'aiuto della riflessione viene creata un'espressione linq in modo dinamico. Sebbene sia una buona implementazione, non volevo davvero tutta questa complessità extra.
Come per il commento qui sotto, posso raggiungere la leggibilità semplicemente specificando i miei parametri in linea (non è necessario per la dichiarazione di matrice oggetto):
var url = AppHelper.PluginService.Execute<string>("ImagePlugin", "GetImageUrl", image, size);
Poiché si utilizza la parola chiave 'params', si può fare' immagine, dimensione' invece di 'nuovo oggetto [] {immagine, dimensione}'. Lo renderebbe più leggibile, e dato che i metodi 'Invoke' accettano array di oggetti, lascerei la firma del metodo così com'è. – Necros