2

我们有一个 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

被执行的代码是

所以有很多这些单行函数在窗口/用户控件的上下文中执行

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

通过阅读 CMS 的详细信息,例如果园、Umbraco 等

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

谢谢阅读

4

1 回答 1

0

是的,有可能。但是,除非您放宽要求,否则这并非易事。

这里有几种方法可以完成这样的事情:

选项1:

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

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

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

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

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

System.CodeDom.Compiler 
System.Reflection.Emit

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

对于这个小任务,这可能比它的价值更多。

选项 2:

另一种方法是使用插件架构并使用特定的工具栏/组件相关方法动态加载 DLL(基于某些界面,因此您可以轻松执行所需的操作,而无需大量硬编码,例如 a Command pattern,具体取决于您的配置)加载适当的程序集并执行其逻辑来配置您的组件。

对于手头的任务,这可能仍然比您想要处理的更多。

选项 3:

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

您可以在一个通用程序集中包含您需要的所有方法,并一直引用它。然后根据您在运行时加载的组件,使用配置来确定需要调用或执行哪些方法。这避免了对复杂的过度设计的需求并完成了相同的任务。

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

于 2013-03-20T10:29:40.790 回答