日期:2014-05-18  浏览次数:20757 次

如何在反射中传入事件与触发该事件
我有一个主窗体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)); 修改成你自己的代理。