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);
    }
}

私がやりたいのは、でイベントを発生させること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

イベントを呼び出す public メソッドを B に追加し、B のインスタンスをコンバーターに渡すことができます。コンバーターでは、このメソッドを呼び出すことができます。

2 つ目の方法は、CalculateData メソッドを変更して特別な例外をキャッチし、それについて通知する方法です。内部コンバーターを投げるだけです。

于 2012-05-05T14:14:04.303 に答える