我有一个半泛型类,它从另一个类接收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以指示它处于错误状态,因此我需要标记数据并通知用户,但它在我的程序中是否真的是异常?
答案 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方法以捕获特殊异常并通知它。内部转换器只是抛出它。