订阅在 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 以指示它处于错误状态,因此我需要标记数据并通知用户,但这真的是我的程序中的异常吗?
我同意其他人的观点,这看起来最好的方法是使用异常:创建一个新的异常类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 方法以捕获特殊异常并通知它。 里面转换器只是扔它。