通过带参数的字符串执行任何方法



我一直在修补一个CMS,我正在做一个个人项目,我已经到了一个点,我卡住了。

基本上,我有一个插件管理器,它在运行时加载程序集,寻找标记有自定义属性的方法,并使这些方法可以从我编写的模板引擎中调用。

我有模板引擎解析模板到表达式得到编译成一个函数,我可以缓存和调用。在这个模板中有一小段代码被解析来做不同的事情,比如调用插件上的一个方法。

模板代码示例:

到目前为止,我已经正确地解析了这个,我有方法名和参数作为字符串,int, bool等。

我写的插件管理器也工作得很好,但我有麻烦将两者连接在一起。

例如这是一个插件类:

[Plugin(Name="Test")]
public class TestPlugin
{
    private DateTime _startTime;
    public TestPlugin()
    {
        _startTime = DateTime.Now;
    }
    [TemplateAction]
    public string Test(int number, string testString)
    {
        return "TEST";
    }
}

我需要能够调用Test()从我的解析模板,并在任何参数从模板传递到方法。我创建了一个系统。委托带有属性的方法,并在模板引擎中添加一个表达式,作为缓存方法的一部分来调用Test()。

我不知道的是如何将解析后的参数从模板传递到方法。我试图创建一个对象[]并将其传递到委托上的DynamicInvoke,但它抱怨参数不匹配,所以我有点卡住了。我不确定是否可以通过表达式将object[]传递给具有(params object[] args)作为签名的方法。

性能也是DynamicInvoke的一个关注点,所以如果有一种方法可以在不使用DynamicInvoke或创建一些我可以缓存的东西的情况下完成这一点,那将是伟大的。

很抱歉,如果我不清楚,有任何问题请提。

任何帮助都非常感谢。

里克。

好了,经过一番思考,感谢D Stanley,我做到了。

foreach (var method in type.GetMethods().Where(x => x.GetCustomAttributes(typeof(TemplateActionAttribute), true).Length > 0))
{
    if (method.ReturnType != typeof(string)) continue;
    PluginTemplateActions.Add(method.Name, o => (string)method.Invoke(plugin, o));
}

到目前为止,它的工作方式只是我想要的,但这也会比DynamicInvoke更快吗?

你可以使用反射:

TestPlugin plugIn = new TestPlugin();
object[] params = null //... set parameters here
MethodInfo mi = typeof(TestPlugin).GetMethod("Test");
mi.invoke(plugIn,params);

相关内容

  • 没有找到相关文章

最新更新