4

私は現在、リクエストのルーティング方法を決定する「ルール」をユーザーが作成できる承認ルーティング WCF サービスを開発しています。ルートは、Request クラスの「ObjectToEvaluate」プロパティを「Rule」クラスの「ObjectToEvaluate」プロパティと比較することによって決定されます。「UnitOfMeasurement」列挙型は、各クラスの「ObjectToEvaluate」プロパティをキャストする方法を決定します。

public enum UnitOfMeasurement
{
    Currency = 1,
    Numeric = 2,
    Special = 3,
    Text = 4,
}

public class Request
{
    public object ObjectToEvaluate { get; set; }
}

public class Rule
{
    public object ObjectToEvaluate { get; set; }

    public virtual void ExecuteRule()
    {
        //logic to see if it passes the rule condition
    }
}

「UnitOfMeasurement」列挙型を使用して「ObjectToEvaluate」プロパティをキャストするメソッドを実装する最良の方法は何でしょうか?

4

3 に答える 3

5

列挙型の値をチェックする暗黙の型演算子を使用します。こうすることで、呼び出し元はオブジェクトを表現したい型に透過的に割り当てることができます。例えば:

public class CastableObject {

    private UnitOfMeasurement eUnit; // Assign this somehow

    public static implicit operator int(CastableObject obj) 
    {
        if (obj.eUnit != UnitOfMeasurement.Numeric)
        {
            throw new InvalidCastException("Mismatched unit of measurement");
        }
        // return the numeric value
    }

    // Create other cast operators for the other unit types
}
于 2008-10-16T17:02:04.750 に答える
1

測定単位はどこから取得していますか?列挙型は表示されますが、APIの他の場所に列挙型への参照が表示されません。

どこかから入手したとすると、最も簡単な解決策はswitchステートメントかもしれません。少し醜いですが、:

  • それはうまくいくでしょう
  • わかりやすい
  • 速くなります

質問についてのすべてを理解しているとはまだ完全には確信していません。特に、キャスト後に他のオブジェクトが何に使用されるかを説明していないためです。

于 2008-10-16T16:49:19.783 に答える
1

Unit of Measurement 列挙型は、承認ルーティング サービスに含まれています。Rule クラスをさらに詳しく説明すると、他のすべてのタイプのルールの基本クラスとして使用されます。これは、NxBRE ビジネス ルール エンジンNxBRE ホームページのフロー エンジンに大まかに基づいています。

LessThanRule クラスの例を次に示します (元の質問を修正して、正しい機能を反映させました)。

public class LessThanRule : Rule
{
    private bool m_Result = false;
    private object m_ObjectToCompare = null;
    private object m_ObjectToEvaluate = null;

    public bool Result
    {
        get { return this.m_Result; }
    }

    public object ObjectToCompare
    {
        get { return this.m_ObjectToCompare; }
        set { this.m_ObjectToCompare = value; }
    }

    public object ObjectToEvaluate
    {
        get { return this.m_ObjectToEvaluate; }
        set { this.m_ObjectToEvaluate = value; }
    }

    public override void ExecuteRule()
    {
        if (((IComparable)this.m_ObjectToEvaluate).CompareTo(this.m_ObjectToCompare) < 0)
            this.m_Result = true;
    }
}

お役に立てれば....

于 2008-10-16T17:25:38.120 に答える