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

本文关键字:事件 Func | 更新日期: 2023-09-27 18:33:13

我有一个半泛型类,它从另一个类接收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 以指示它处于错误状态,因此我需要标记数据并通知用户,但这真的是我的程序中的异常吗?

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

我同意其他人的观点,这看起来最好的方法是使用异常:创建一个新的异常类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);
    }
}

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

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

第二种方法可以修改 CalculateData 方法以捕获特殊异常并通知它。 里面转换器只是扔它。