在我的插件體系結構中,我正在向插件服務傳遞插件名稱(字符串),方法名稱(字符串)和參數(對象數組),以執行指定的方法並返回結果類型T)。將匿名類型作爲方法參數傳遞
插件服務的執行方法可以如下圖所示:
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;
}
使用示例:
var url = AppHelper.PluginService.Execute<string>(
"ImagePlugin",
"GetImageUrl",
new object[] { image, size });
我寧願做的是傳遞一個匿名類型,而不是(因爲我認爲這是更可讀)即
var url = AppHelper.PluginService.Execute<string>(
"ImagePlugin",
"GetImageUrl",
new { image = image, targetSize = size });
如何更改我的Execute方法來映射匿名t ype屬性到我的插件方法參數?
我曾經考慮在.net 4.0中使用新的動態類型,但我更喜歡在插件方法上定義我的參數,而不是接受一個動態對象。
感謝 本
[更新]
通過ASP.NET MVC的源代碼後,看它似乎很簡單拉匿名類型爲對象字典例如RouteValueDictionary。 在反射的幫助下,linq表達式是動態創建的。雖然它很好的實現,但我並不是真的想要所有這些額外的複雜性。
按照下面的評論,我只能通過指定我的參數在線(無需對象數組聲明)實現的可讀性:
var url = AppHelper.PluginService.Execute<string>("ImagePlugin", "GetImageUrl", image, size);
由於您正在使用'params'關鍵字,因此您可以執行'image,size'而不是'new object [] {image,size}''。它會使它更具可讀性,並且由於'Invoke'方法接受對象數組,所以我會保留方法簽名。 – Necros 2010-08-09 01:32:27