gpt4 book ai didi

c# - 有没有办法通过 C# 中的 Type.InvokeMember 或消息调用窗体或类的私有(private)函数?

转载 作者:行者123 更新时间:2023-11-30 22:42:37 25 4
gpt4 key购买 nike

我的主应用程序中有一堆表单,它们既有私有(private)函数也有公共(public)函数。我有一个插件架构,可以在创建和加载表单时访问每个表单,并保留对它的引用以更新它、添加控件等。

我们正在尝试做的是实现这个插件架构,但有些插件可能需要调用表单的私有(private)函数。这是我尝试使用 Type.InvokeMember 的示例:

public partial class Form1 : Form
{
Form1()
{
InitializeComponent();
}

private void SayHello()
{
MessageBox.Show("Hello World!");
}
}

在另一个 DLL 中...

public class PluginClass
{
Form1 myReferencedForm1;

PluginClass()
{
//Constructor code here...

//Also sets the reference to existing Form1 instance
}

private CallMember()
{
Type t = typeof(Form1); //I guess I can also call 'myReferencedForm1.GetType();' here as well
t.InvokeMember("SayHello",
System.Reflection.BindingFlags.InvokeMethod |
System.Reflection.BindingFlags.NonPublic |
System.Reflection.BindingFlags.Public,
null, myReferencedForm1, new object[] { });
}
}

我已经尝试了 "SayHello""SayHello()",它们都返回了 'MissingMethodException' 错误:

Method 'Form1.SayHello()' not found.

我需要创建和使用 Binder 吗?如果是这样,我该怎么做?我可以使用 System.Windows.Forms.Message 更轻松地做到这一点吗?如果是怎么办?

最佳答案

不要那样做。

创建一个接口(interface):IPluginHostDoMethod(string Name) 成员。为每个表单实现该接口(interface),您甚至可以使用 partial class 声明将其提取到其他文件。

在方法实现中,做简单的 switch case 来启动正确的方法。使用一些脚本来生成它。

public interface IPluginHost
{
void DoMethod(string MethodName);
}

public partial MyForm:Form, IPluginHost
{
#region IPluginHost implementation
public void DoMethod(string MethodName)
{
switch (MethodName)
case "SayHello":
SayHello();
break;
...
}
#endregion
}

如果您正在做架构 - 不要一开始就搞砸。

关于c# - 有没有办法通过 C# 中的 Type.InvokeMember 或消息调用窗体或类的私有(private)函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4327530/

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