我所擁有的是我的主應用程序中的一些表單,它們具有私人和公共功能。我有一個插件體系結構,它可以在創建和加載時訪問每個表單並持有對其進行更新,添加控件等的引用。有沒有辦法通過Type.InvokeMember或C#中的消息調用窗體或類的私有函數?
我們正在嘗試的是在體系結構中實現此插件,但一些插件可能需要調用窗體的私有函數。下面是我用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.
我是否需要創建並使用活頁夾?如果是這樣,我該怎麼做?我可以使用System.Windows.Forms.Message更簡單嗎?如果是這樣如何?
這是[如何使用反射來調用C#中的私有方法?]的副本(http://stackoverflow.com/questions/135443/how-do-i-use-reflection-to-invoke- a-private-method-in-c) – jason 2010-12-01 18:11:39
這些是在同一個dll中嗎?如果是這樣的話,你可以讓SayHello()內部而非私人的 – wangburger 2010-12-01 18:13:16
不,他們不是。我將更新問題中的代碼。 – 2010-12-01 18:13:49