读书人

怎么在反射中传入事件与触发该事件

发布时间: 2012-04-20 15:27:03 作者: rapoo

如何在反射中传入事件与触发该事件
我有一个主窗体A,有一个事件:
private void CheckedChanged(bool myChecked)
{
if (myChecked)
{
tabPage2.Parent = tabControl1;//显示
}
else
{
tabPage2.Parent = null;//隐藏
}
}

是通过反射调用B.dll文件,如何将主窗体中的这个事件传入到B.dll文件中?

并且B.dll文件的属性变化时,如何触发这个事件?

[解决办法]
还是反射啊...例子...

C# code
Type t = 对象.GetType();System.Reflection.EventInfo changed = t.GetEvent("Changed");Delegate d = Delegate.CreateDelegate(changed.EventHandlerType, eventHandler);changed.AddEventHandler(对象, d);
[解决办法]
终于看明白了,你这表达能力啊...

你要给自己的控件声明一个公共事件比如叫Changed,然后在“当控件实现选中或取消选中”时触发事件....

在调用方,按我4楼的例子反射订阅事件...eventHandler就是你所谓的CheckedChanged,但是要把它的方法签名改成Changed事件委托定义的签名...
[解决办法]
这样会不会简单一点呢??

C# code
public partial class UserControl1 : CheckBox{    public UserControl1()    {        InitializeComponent();    }    public TabPage TabPage;    public TabControl TabControl;    protected override void OnCheckedChanged(EventArgs e)    {        if (TabPage != null)        {            TabPage.Parent = this.Checked ? TabControl : null;        }        base.OnCheckedChanged(e);       }}
[解决办法]
[Quote=引用:]
11楼的朋友:如果自定义控件或其他文件,如果要在程序发布时,与主程序分别放到不同的目录下,除了反射,还可以用什么方法实现二者的相互调用?能否简单的举个例子?
[/Quote

用Codebase配置:
使用 <codebase> 标记应用程序配置 (.config) 文件
<codebase> 标记指定公共语言运行库在哪里可以找到程序集。 公共语言运行库从.config 文件应用 <codebase> 标记的设置。 <codebase> 标记该设置确定版本和程序集的位置。

XML code
<configuration>   <runtime>      <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">         <dependentAssembly>            <assemblyIdentity name="MyAssembly2"  culture="neutral" publicKeyToken="307041694a995978"/>            <codeBase version="1.0.1524.23149" href="FILE://C:/Myassemblies/MyAssembly2.dll"/>         </dependentAssembly>      </assemblyBinding>   </runtime></configuration>
[解决办法]
探讨
引用:
在调用方,按我4楼的例子反射订阅事件...eventHandler就是你所谓的CheckedChanged,但是要把它的方法签名改成Changed事件委托定义的签名...


还是没有搞明白,我控件中已添加了事件,直接调用这个控件也没有问题,可以响应事件;
public delegate void MyChecked(object sender, ……

[解决办法]
你的事件定义不符合 AddEventHandler 里的 new EventHandler 的代理的参数约定。

可以修改事件的定义:

public event EventHandler CheckedChanged;

或者把

MyEvent.AddEventHandler(myObj, new EventHandler(MyCheckBox1_Checked)); 修改成你自己的代理。

读书人网 >C#

热点推荐