在我的插件体系结构中,我正在向插件服务传递插件名称(字符串),方法名称(字符串)和参数(对象数组),以执行指定的方法并返回结果类型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