我们有一个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 ?
感谢阅读
答案 0 :(得分:0)
是的,这是可能的。 然而,除非你放宽要求,否则这不是微不足道的。
以下几种方法可以实现以下目标:
选项1:
您可以通过基于令牌创建(或查找现有的)伪语言来描述您需要执行的操作来解决此问题。
SharePoint做了类似的事情,一些框架允许从配置文件生成动态代码。
基本上,您使用XML或任何选择的伪语言来定义方法的行为,参数和条件。如果愿意,您甚至可以在其中包含实际的C#代码。
然后,您可以动态生成动态程序集,并使用反射调用工具栏上的方法。
查看这些命名空间以获取更多信息:
System.CodeDom.Compiler
System.Reflection.Emit
System.Reflection.Emit命名空间有一个ILGenerator类,您可以使用它来创建IL指令作为动态生成类型的一部分。
这可能比这个小任务更值得参与。
选项2:
另一种方法是使用插件架构并使用特定的工具栏/组件相关方法动态加载DLL(基于某些界面,这样您就可以轻松地执行所需的操作而无需大量的硬编码,例如{{1}根据配置,您可以加载适当的程序集并执行它的逻辑来配置组件。
这可能比您想要处理的任务更多涉及。
选项3:
可能最容易实施,我认为对于一个小项目来说最有意义。
您可以在公共程序集中包含所需的所有方法,并始终引用它。然后使用配置确定需要调用或执行哪些方法,具体取决于您在运行时加载的组件。这避免了对复杂的过度工程的需要,并完成了同样的任务。
选项3的缺点是,无论何时添加或配置新组件,都必须重新编译项目。由于您并非真正尝试创建动态,可扩展的应用程序,并且只是想要处理UI组件的某些配置,因此该选项仍然有意义,因为如果您要定义可以配置的新组件(新菜单或其他小部件) ),无论如何你仍然需要重新编译你的项目。