Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/271.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 加入&;“执行小型.net”;脚本“;在WPF应用程序中_C#_.net_Visual Studio 2010 - Fatal编程技术网

C# 加入&;“执行小型.net”;脚本“;在WPF应用程序中

C# 加入&;“执行小型.net”;脚本“;在WPF应用程序中,c#,.net,visual-studio-2010,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_n

我们有一个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的上下文中执行的

现在,我们正在寻找一种方法,将此函数体包含在config表中,而不是在代码中创建这一行函数

通过阅读诸如orchard、Umbraco等CMS的详细信息,他们似乎在管理屏幕中为各种操作创建规则,使用一些极简语法,这与我希望做的有点类似,希望这是可能的

Questions
a) is it possible to create these scriptlets
b) how ?
感谢阅读

是的,这是可能的。但是,除非您放宽要求,否则它不是微不足道的

以下是完成类似任务的几种方法:

选项1:

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

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

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

然后可以动态生成动态装配,并使用反射调用工具栏上的方法

有关详细信息,请查看这些名称空间:

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

对于这个小任务来说,这可能比它的价值更大

选项2:

另一种方法是使用插件体系结构,并使用特定的工具栏/组件相关方法动态加载DLL(基于某些接口,因此无需大量硬编码即可轻松执行所需内容,如
命令模式
,并根据配置加载适当的程序集并执行其逻辑以配置组件

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

选项3:

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

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

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