3

我有一个半通用类,它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);
    }
}

我想要做的是能够在 B 类中引发一个事件,Func<>但能够在 B 类中处理该事件。现在该事件实际上是在 A 类中引发的。

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

编辑 只要它是一个事件而不是一个例外。这是来自传感器的外部数据。传感器发送1023表示它处于错误状态,所以我需要标记数据并通知用户,但它真的是我的程序中的异常吗?

4

3 回答 3

1

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

于 2012-05-05T14:17:39.117 回答
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);
    }
}
于 2012-05-05T14:20:45.343 回答
0

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

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

于 2012-05-05T14:14:04.303 回答