订阅在Func<>中引发的事件

时间:2012-05-05 14:05:03

标签: c# events func

我有一个半泛型类,它从另一个类接收Func<>来告诉它如何转换数据。以某种简单的方式,代码看起来像:

public class A
{
    public B b;

    public void init()
    {
        b = new B(ConvertRawData);
    }

    public double ConvertRawData(double rawData)
    {
        if(rawData == 1023)
            RaiseMalfunctionEvent();
        return rawData;
    }

    public void CalculateData(double rawData)
    {
        b.CalculateData(rawData);
    }
}

public class B
{
    event EventHandler Malfunction;

    Func<double, double> _converter;
    public B(Func<double, double> converter)
    {
        _converter = converter;
    }

    public void CalculateData(rawData)
    {
        var myVal = _converter(rawData);
    }
}

我想要做的是能够在Func<>中举起一个事件,但能够在B组中处理该事件。现在该事件实际上是在A组中提出的。

所以我的问题是如何在不暴露B类公共事件处理程序的情况下创建B类?或者这甚至可能吗?

修改 至于它是一个事件而不是一个例外。这是来自传感器的外部数据。传感器发送1023以指示它处于错误状态,因此我需要标记数据并通知用户,但它在我的程序中是否真的是异常?

3 个答案:

答案 0 :(得分:1)

如果您要做的只是捕获可能的错误,您可以抛出异常而不是调用RaiseMalfunctionEvent,并在调用函数时捕获该异常。

答案 1 :(得分:1)

我同意其他人的意见,看起来最好的方法是使用异常:创建一个新的异常类ComnversionMalfunctionException,将其抛入您的委托中,然后在CalculateData()中捕获它。在catch子句中,您可以引发事件。

但是如果您不想使用异常,可以通过将委托传递给引发事件的converter委托来完成此操作:

public class A
{
    public double ConvertRawData(Action raiseMalfunctionEvent, double rawData)
    {
        if(rawData == 1023)
            raiseMalfunctionEvent();
        return rawData;
    }
}

public class B
{
    event EventHandler Malfunction;

    Func<Action, double, double> _converter;
    public B(Func<Action, double, double> converter)
    {
        _converter = converter;
    }

    public void CalculateData(rawData)
    {
        var myVal = _converter(() => Malfunction(this, EventArgs.Empty), rawData);
    }
}

答案 2 :(得分:0)

您可以向B调用您的事件添加公共方法,并将B的实例传递给转换器。在转换器中,您可以调用此方法。

第二种方法是修改CalculateData方法以捕获特殊异常并通知它。内部转换器只是抛出它。