请教:如果判断子类是否处理了继承自父类的某个事件?测试代码如下:
/// <summary>
/// class1是class2的父类
/// </summary>
public class class1
{
public delegate void TestEventHandler(string Message);
public event TestEventHandler Testdelegate;
virtual public void OnTest(string Message)
{
Testdelegate(Message);
}
}/// <summary>
/// class2是class1的子类
/// </summary>
public class class2:class1
{
}/// <summary>
/// 测试类
/// </summary>
public class TestClass
{
private class2 oClass2 =new class2();
public TestClass()
{
oClass2.Testdelegate+=new SBOTest.class1.TestEventHandler(oClass2_Testdelegate);
} private void oClass2_Testdelegate(string Message)
{
}
    /// <summary>
    /// 问题:
    ///     如果判断子类class2是否处理了Testdelegate事件?
    /// </summary>
    /// <returns></returns>
public bool hasEvent()
{
FieldInfo oInfo = oClass2.GetType().GetField("Testdelegate", BindingFlags.NonPublic | BindingFlags.Instance);
Delegate oDelegate = ( Delegate ) oInfo.GetValue(oClass2);
        return (oDelegate != null);
}
}

解决方案 »

  1.   

    oDelegate != null肯定成立啊,因为不是在上面已经给值了吗,但是oDelegate这个事件并不一定被触发过,因为从上面的代码来看,并没有人为触发的代码啊
      

  2.   

    To  liduke(天下有雪):
       TestClass是我的测试类,我是想晓得如果在代码中使用了class2 ,
    我需要判断,这个class2 的Testdelegate事件,是否有事件处理函数。
    测试类TestClass中的hasEvent()是我要写的判断函数,这个函数在使用时报错。
    我不知道正确的应该怎么写?
      

  3.   

    感觉lz对事件机制还不了解
    class1 , class2 只是触发事件,真正处理是在引用类里,class1 ,class2 只是相当于包含一个函数指针
      

  4.   

    呵呵,谢谢各位赐教。
    这么问也许清楚些:
        引用类如何判断oClass2(oClass2是class2类的实例)处理了Testdelegate事件?
      

  5.   

    public bool hasEvent()
    {
    return this.Testdelegate != null
       }
      

  6.   

    楼主把event 和delegate两个概念没弄清楚
      

  7.   

    首先谢谢各位的不吝赐教。
    事件(event)是委托(delegate)的一种特殊形式吧。我是不是没有说明白我的需求?有2个类如下:
    /// <summary>
    /// class1是class2的父类
    /// </summary>
    public class class1
    {
    public delegate void TestEventHandler(string Message);
    public event TestEventHandler Testdelegate;
    virtual public void OnTest(string Message)
    {
    Testdelegate(Message);
    }
    }/// <summary>
    /// class2是class1的子类
    /// </summary>
    public class class2:class1
    {
    }在使用class2时,如果判断class2的实例,处理了Testdelegate事件?
      

  8.   

    你说的处理是什么意思,也就是你在构造函数里面加入的那个空方法是不是if(this.Testdelegate != null) //这一句就是判断是否有加入的委托
    {
       Testdelegate();
    }//你把空方法写成这样
    private void oClass2_Testdelegate(string Message)
    {
       Console.WrtieLine("abc");
    }
      

  9.   

    if(oDelegate != null)就可以判断事件和事件处理函数联系起来没有
      

  10.   

    啊,我还没说清楚:(
    第三方使用class2的类,比如说是TestClass。
    TestClass如何判断class2的实例,处理了Testdelegate事件?也就是,TestClass得到一个object对象,已知这个对象有一个“Testdelegate”事件(这个对象也许是class2)。如何判断这个已经对象处理了Testdelegate事件?
      

  11.   

    To  Ivony:
       处理了事件到底是什么意思?
    就是事件是否有和他关联的事件处理函数。
    类似这种:oClass2.Testdelegate+=new SBOTest.class1.TestEventHandler(oClass2_Testdelegate);
      

  12.   

    我只想知道有没有处理,不关系谁处理。
    当事件定义在一个直接使用的类里面,我使用
    public bool hasEvent()
    {
    FieldInfo oInfo = oClass2.GetType().GetField("Testdelegate", BindingFlags.NonPublic | BindingFlags.Instance);
    Delegate oDelegate = ( Delegate ) oInfo.GetValue(oClass2);
            return (oDelegate != null);
    }
    是可以检测到的。
    但如果是继承父类的Event,那么,这个函数就处理不了了。
      

  13.   

    To  Ivony:
       处理了事件到底是什么意思?
    就是事件是否有和他关联的事件处理函数。
    类似这种:oClass2.Testdelegate+=new SBOTest.class1.TestEventHandler(oClass2_Testdelegate);你自己都知道已经关联了还问?
      

  14.   

    To zyug(LovlyPuppy) :
      我昏,我给的是测试代码呀。
      要是已知必然关联了,我就不用这么费劲了呀。
      

  15.   

    public class class1
    {
    public delegate void TestEventHandler(string Message);
    public event TestEventHandler Testdelegate;
             public bool IsExecute = false;
    virtual protected void OnTest(string Message)
    {
    if(Testdelegate!=null)
    {
    Testdelegate(Message);
    IsExecute = true;
    }
    }
    }
      

  16.   

    需求是: 1。有三个类:【类1】,【类2】,【类3】 。
            2。【类1】有一个【事件1】( public event 事件1;)
            3。【类1】是【类2】的父类。
            4。【类2】是交给程序员使用的类。
            5。【类3】在操作【类2】的时候,需要判断,程序员是否给【类2】赋予了【事件1】的
                事件处理函数。我这么说,各位热心的大侠,能看明白吗?
             
      

  17.   

    如果可以修改Class1 可以这样.如果在实例中判断,吾不知如何做
    using System;namespace ConsoleApplication1
    {
    public class class1
    {
    public delegate void TestEventHandler(string Message);
    public event TestEventHandler Testdelegate; virtual public void OnTest(string Message)
    {
    Testdelegate(Message);
    } public class1()
    { } public bool hasEvent()
    {
    return (Testdelegate != null);
    }
    } /// <summary>
    /// class2是class1的子类
    /// </summary>
    public class class2:class1
    {
    public class2()
    {

    }
    } public class TestClass2
    {
    private static class2 c2;
    /// <summary>
    /// 应用程序的主入口点。
    /// </summary>
    [STAThread]
    static void Main(string[] args)
    {
    c2=new class2();
    c2.Testdelegate+=new ConsoleApplication1.class1.TestEventHandler(c2_Testdelegate);
    c2.OnTest("123123");
    } private static void c2_Testdelegate(string Message)
    {
    Console.Write( Message );
    Console.Write(c2.hasEvent().ToString());  //结果为  123123True
    }
    }
    }