添加&在WPF应用程序中执行小的.net“脚本”

时间:2013-03-20 03:50:26

标签: c# .net visual-studio-2010

我们有一个wpf应用程序,它使用很多配置来说UI工具栏/按钮等。当他们使用ICommand启用/禁用等时,他们在运行时根据函数名称等绑定它们。

这些功能中很多都非常简单,例如

bool CanExecuteThisCommandIf(MyParms p){
     return MyObject != null && MyObject.Type == MyEnum.Type3
}

并且db表中的定义包括

toolbar_id
button_id
caption 
func_name
enabled_if
button_image
tooltip_text

并且执行的代码是

因此在window / usercontrol

的上下文中执行了很多这样的一行函数

现在,寻找一种方法在配置表本身中包含此函数的主体,而不是在代码中创建这一行函数

从阅读CMS的详细信息,如果园,Umbraco等,似乎他们正在管理屏幕中创建规则,使用一些简约语法进行各种操作,这有点类似于我想要做的事情,希望它是可能的

Questions
a) is it possible to create these scriptlets
b) how ?

感谢阅读

1 个答案:

答案 0 :(得分:0)

是的,这是可能的。 然而,除非你放宽要求,否则这不是微不足道的。

以下几种方法可以实现以下目标:

选项1:

您可以通过基于令牌创建(或查找现有的)伪语言来描述您需要执行的操作来解决此问题。

SharePoint做了类似的事情,一些框架允许从配置文件生成动态代码。

基本上,您使用XML或任何选择的伪语言来定义方法的行为,参数和条件。如果愿意,您甚至可以在其中包含实际的C#代码。

然后,您可以动态生成动态程序集,并使用反射调用工具栏上的方法。

查看这些命名空间以获取更多信息:

System.CodeDom.Compiler 
System.Reflection.Emit

System.Reflection.Emit命名空间有一个ILGenerator类,您可以使用它来创建IL指令作为动态生成类型的一部分。

这可能比这个小任务更值得参与。

选项2:

另一种方法是使用插件架构并使用特定的工具栏/组件相关方法动态加载DLL(基于某些界面,这样您就可以轻松地执行所需的操作而无需大量的硬编码,例如{{1}根据配置,您可以加载适当的程序集并执行它的逻辑来配置组件。

这可能比您想要处理的任务更多涉及。

选项3:

可能最容易实施,我认为对于一个小项目来说最有意义。

您可以在公共程序集中包含所需的所有方法,并始终引用它。然后使用配置确定需要调用或执行哪些方法,具体取决于您在运行时加载的组件。这避免了对复杂的过度工程的需要,并完成了同样的任务。

选项3的缺点是,无论何时添加或配置新组件,都必须重新编译项目。由于您并非真正尝试创建动态,可扩展的应用程序,并且只是想要处理UI组件的某些配置,因此该选项仍然有意义,因为如果您要定义可以配置的新组件(新菜单或其他小部件) ),无论如何你仍然需要重新编译你的项目。