在我的插件架构中,我当前将插件名称(字符串)、方法名称(字符串)和参数(对象数组)传递给我的插件服务,以执行指定的方法并返回结果(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 });
如何更改我的执行方法以将匿名类型属性映射到我的插件方法参数?
我曾考虑过在 .net 4.0 中使用新的动态类型,但我更喜欢在插件方法上定义参数,而不是接受一个动态对象。
谢谢
本
[Update]
查看 ASP.NET MVC 源代码后,将匿名类型放入对象字典中似乎很简单,例如路由值字典。
借助反射,动态创建 linq 表达式。尽管它是一个很好的实现,但我并不真正想要所有这些额外的复杂性。
根据下面的评论,我只需通过内联指定参数即可实现可读性(不需要对象数组声明):
var url = AppHelper.PluginService.Execute<string>("ImagePlugin", "GetImageUrl", image, size);