我有一个自定义的集合,我增加了ValidateItem事件。每当一个项目被添加到或更新的自定义集合中的事件ValidateItem将被调用。

我想允许派生类能够订阅该事件,并确定一个项目是否是“有效的”自己的逻辑和潜在禁止它被添加到集合,如果它是“无效”。

但我试图找出如何让呼叫者事件知道是怎么回事,如何通过关于什么是上回要的信息。

我定制的EventArgs从CancelEventArgs继承,所以我必须要通过取消位回使用呼叫者的能力。但我从来没有见过其中的错误信息(错误代码,消息等)被以这种方式传回任何情况下,所以我想知道如果这可能不是最好的办法。

我应该补充一点,我想回传给我的自定义EventArgs类的任何错误数据,是有充分的理由支持或反对呢?或有其他的,更好的方法来做到这一点?

下面是我EventArgs类:

public delegate void ItemValidationEventHandler(object sender, ItemValidationEventArgs e);

public class ItemValidationEventArgs : CancelEventArgs
{
    public ItemValidationEventArgs(object item, ObjectAction state, EventArgs e)
    {
        Item = item;
        State = state;
        EventArgs = e;
    }

    public ItemValidationEventArgs(object item, ObjectAction state) : this(item, state, new EventArgs())
    {
    }

    public ItemValidationEventArgs() : this(null, ObjectAction.None, new EventArgs())
    {
    }

    // is there a better way to pass this info?
    public string ErrorMessage {get; set;}
    public int ErrorNumber {get;set;}

    public object Item { get; private set; }
    public ObjectAction State { get; private set; }

    public EventArgs EventArgs { get; private set; }
}

更新:我想另一个另一种选择是使用这样的:

virtual bool Validate(object item, ObjectAction action, out string errorMessage) 

方法中派生类。虽然我倾向于选择避免了参数...

如果任何人有每个方法的利弊任何想法,我很想听听他们!

谢谢, 最大

有帮助吗?

解决方案

使用事件这可能不是最好的设计方法。

由于是将被重写此行为继承类,该方法应该被标记为受保护的和虚拟:

protected virtual bool Validate(object item);

我太不喜欢使用的参数out,所以按照你最初的直觉使用EventArgs,你应该创建一个类来封装您的验证结果。

示例:

class ValidationResult
{
     public string ResultMessage{get;set;}
     public bool IsValid {get;set;}
}

您方法将随后是:

protected virtual ValidationResult Validate(object item)
{
   ValidationResult result = new ValidationResult();

   // validate and set results values accordingly

   return result;
}

优点和使用这种过度的事件的缺点是事件意在使用时要发布一个动作或信息传递给多个用户。该用户是你一无所知类。你不关心他们是谁或他们做什么。他们应该从来没有真正的信息传递回通知类两种。他们应该处理给他们的事件信息。

在您的实例,您的继承的类是唯一的订户。最重要的是要能够传有用的信息返回给父类。传承符合这一期望的行为要好得多,同时也让您轻松实现不同类型的验证类。随着事件,你将不得不继续键入代码,一遍又一遍地把事件处理程序(非常难看IMO)。

其他提示

我不知道你在描述真正适合观察者,观察到的模式,你通常会与事件看。

由于这些派生类我可能会看到虚拟化的对象的验证方法和具有该儿童提供一个特定的验证程序。

好吧,如果你创建自己的自定义验证事件,自定义的验证事件参数一起,我会假设你宁愿回传状态/错误代码,而不是抛出异常,如果事情不验证。

在这种情况下,如果你想有一个不会抛出异常验证,那么是的,我会添加你需要的那些字段的自定义事件参数 - 他们已经定制的,所以没有理由不给他们延长根据您的需求: - )

马克

一对夫妇的快速的想法:

我想使只读属性,以符合EventArgs的类的“正常”模式。

也许与错误信息的属性应该被封装在一起成为一些ErrorInformation类(这将使它更容易一点是传递该信息的其他方法)。

有一个问题:你怎么使用EventArgs的属性。

自定义事件参数的专门用于传递信息和事件处理程序,所以是的,他们是一个很好的地方放了。

另一个选项将抛出异常。 - 这是相当重手,而是应该由该事件执行停止其他的事件处理程序

和EventArgs的CancelEventArgs没有任何成员携带信息给订户。 所以,你通常会从这些类继承,并添加一个或多个成员携带的信息。 您也可以让你的类通用的,这样你就不必做,只要你有不同的数据发送到一个新的EventArgs类。

最后,反而让自己ItemValidationEventHandler委托类型,你可以使用EventHandler<T>,其中T是您的EventArgs参数的类型。

另外,你不需要的EventArgs = E构件。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top