在我的插件架构中,我目前正在将插件名称(字符串)、方法名称(字符串)和参数(对象数组)传递给我的插件服务来执行指定的方法并返回结果(类型为T)。
插件服务的执行方法如下所示:
一个使用示例:
我该如何修改我的Execute方法,将匿名类型属性映射到我的插件方法参数上?
我考虑使用.net 4.0中的新动态类型,但我更喜欢在插件方法中定义我的参数,而不是接受一个动态对象。
谢谢 Ben
[更新]
在查看了ASP.NET MVC源代码后,似乎很容易将匿名类型提取到对象字典(例如RouteValueDictionary)中。借助反射和linq表达式,可以动态创建实现。虽然这是一种好的实现方式,但我并不想增加额外的复杂性。
根据下面的评论,我可以通过内联指定参数来实现可读性(无需声明对象数组)。
插件服务的执行方法如下所示:
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方法,将匿名类型属性映射到我的插件方法参数上?
我考虑使用.net 4.0中的新动态类型,但我更喜欢在插件方法中定义我的参数,而不是接受一个动态对象。
谢谢 Ben
[更新]
在查看了ASP.NET MVC源代码后,似乎很容易将匿名类型提取到对象字典(例如RouteValueDictionary)中。借助反射和linq表达式,可以动态创建实现。虽然这是一种好的实现方式,但我并不想增加额外的复杂性。
根据下面的评论,我可以通过内联指定参数来实现可读性(无需声明对象数组)。
var url = AppHelper.PluginService.Execute<string>("ImagePlugin", "GetImageUrl", image, size);
params
关键字,因此可以使用image, size
代替new object[] { image, size }
。这将使代码更易读,并且由于Invoke
方法接受对象数组,因此我会保留方法签名不变。 - Necros