gpt4 book ai didi

c# - 在 WPF 应用程序中添加和执行小型 .net "scripts"

转载 作者:太空宇宙 更新时间:2023-11-03 16:17:02 25 4
gpt4 key购买 nike

我们有一个 wpf 应用程序,它使用大量配置来表示 UI 工具栏/按钮等。当它们被启用/禁用等时,使用 ICommand 在运行时根据函数名称等绑定(bind)它们。

其中有相当一部分功能真的很简单,例如

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

数据库表中的定义包括

toolbar_id
button_id
caption
func_name
enabled_if
button_image
tooltip_text

执行的代码是

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

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

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

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 指令作为动态生成类型的一部分。

对于这个小任务来说,这可能比它的值(value)更复杂。

选项 2:

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

对于手头的任务,这可能比您想处理的要复杂得多。

选项 3:

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

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

选项 3 的缺点是您必须在任何时候添加或配置新组件时重新编译您的项目。由于您并不是真的在尝试创建一个动态的、可扩展的应用程序,而只是想处理一些 UI 组件的配置,这个选项仍然有意义,因为如果您要定义可以配置的新组件(一个新菜单或一个额外的小部件) ),按理说无论如何你都会在那个时候重新编译你的项目。

关于c# - 在 WPF 应用程序中添加和执行小型 .net "scripts",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15514949/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com