C# 通过传递方法简化委托的创建?

C# 通过传递方法简化委托的创建?,c#,events,delegates,encapsulation,object-oriented-analysis,C#,Events,Delegates,Encapsulation,Object Oriented Analysis,是否有一些方法可以简化委托的创建以便于阅读编码?以下是我希望能够做到的一个例子,我想知道是否有办法做到这一点: public delegate void MyDelegate(Object sender, EventArgs e); public class ClassWithEvent { public event MyDelegate MyEvent; public ClassWithEvent() { } public void RegisterForEven

是否有一些方法可以简化委托的创建以便于阅读编码?以下是我希望能够做到的一个例子,我想知道是否有办法做到这一点:

public delegate void MyDelegate(Object sender, EventArgs e);

public class ClassWithEvent
{
    public event MyDelegate MyEvent;

    public ClassWithEvent() { }

    public void RegisterForEvent(Method)
    {
        MyEvent += new MyDelegate(Method);
    }

    public void Trigger()
    {
        if(MyEvent != null)
        {
            MyEvent(this, null);
        }
    }

}

public class ClassToRegister
{
    public ClassWithEvent MyEventClass = new ClassWithEvent();

    public ClassToRegister() { }

    public void RegisterMe()
    {
        MyEventClass.RegisterForEvent(MyEventMethod);

        MyEventClass.Trigger();
    }

    public void MyEventMethod(Object sender, EventArgs e)
    {
        Console.Writeline("Hello there!");
    }
}

尝试这样做的目的是为了封装。我假设触发事件的类本质上是访问它的类的黑盒。由于这将是我所能看到的最可取的面向对象流程,我想知道是否有一种方法可以做到这一点,或者如果注册类不了解它必须创建的委托,就根本没有办法做到这一点。

是的,从这个意义上说,您不需要命名委托来工作。相反,您可以使用通用委托
操作
操作
)。操作委托返回void,并具有与泛型类型参数匹配的参数

通常情况下,您只需直接公开事件(避免使用“Register”函数),因此无需担心事件的这一部分

如果您使用它,您的代码将如下所示:

public class ClassWithEvent
{
    public event Action<object, EventArgs> MyEvent;

    public ClassWithEvent() { }

    public void RegisterForEvent(Action<object, EventArgs> Method)
    {
        MyEvent += Method;
    }

    public void Trigger()
    {
        if(MyEvent != null)
        {
            MyEvent(this, null);
        }
    }

}

public class ClassToRegister
{
    public ClassWithEvent MyEventClass = new ClassWithEvent();

    public ClassToRegister() { }

    public void RegisterMe()
    {
        MyEventClass.RegisterForEvent(MyEventMethod);

        MyEventClass.Trigger();
    }

    public void MyEventMethod(Object sender, EventArgs e)
    {
        Console.Writeline("Hello there!");
    }
}
带有事件的公共类
{
公共事件行动;
公共类WithEvent(){}
public void RegisterForEvent(操作方法)
{
MyEvent+=方法;
}
公共无效触发器()
{
if(MyEvent!=null)
{
MyEvent(this,null);
}
}
}
公共类类注册器
{
public ClassWithEvent MyEventClass=new ClassWithEvent();
公共类注册器(){}
公共无效登记册()
{
MyEventClass.RegisterForEvent(MyEventMethod);
MyEventClass.Trigger();
}
public void MyEventMethod(对象发送方,事件参数e)
{
控制台。Writeline(“你好!”;
}
}

这段代码是您想要使用的代码,还是确实有效但您想要更改的代码?如果是后者,您能提供您认为应该工作的吗?这是假设代码。我还不熟悉活动和代表,所以我可能在这里的某个地方犯了一个与我的问题无关的错误。我只是想知道是否有一种方法可以让一个类简单地传递它的方法,而不用在它自己的代码中声明该方法的委托。也就是说,“ClassToRegister”是否可以在不知道“MyDelegate”名称的情况下订阅“MyEvent”。是否可以接受一般操作委托?可能?我不知道如何创建泛型。我想我应该研究这棵树。这主要是一个风格问题-我甚至不确定我所问的是否有用处,我猜这将允许一个方法订阅多个不同的类,这些类可能使用不同的委托,所有这些委托都适合(对象发送者,事件参数e)参数。非常感谢-我还没有真正弄明白如何查找它,因为我不确定我要查找的是什么:我非常感激。我觉得“直接公开事件”是C#中似乎违背其面向对象结构的一件事。我仍然不确定我是否喜欢这样的泛型委托,因为我认为我仍然必须在“ClassToRegister”类中声明它-但我有点认为,如果不首先创建指向“store in”的指针,就无法传递方法。我正在制作一个带有内部类的“事件数组”,该类将根据订阅者参数通知订阅者,因此很难让订阅者类管理数组本身。是的,你必须在某个地方声明类型!对于破坏OOP的事件,我不能苟同,你只是得到了一个要调用的函数指针的自动列表。+=基本上是“寄存器”函数。不过这只是我的意见。很高兴我能帮上忙!