C#でオブジェクトを適切な型にキャストする方法を決定する最良の方法は?

StackOverflow https://stackoverflow.com/questions/209354

  •  03-07-2019
  •  | 
  •  

質問

現在、ユーザーが「ルール」を作成できる承認ルーティングWCFサービスを開発しています。リクエストのルーティング方法を決定します。ルートは、「ObjectToEvaluate」を比較して決定されます。 " ObjectToEvaluate"に対するRequestクラスのプロパティ「ルール」のプロパティクラス。 " UnitOfMeasurement" enumは、「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
    }
}

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

役に立ちましたか?

解決

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

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
}

他のヒント

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

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

  • 動作します
  • わかりやすい
  • 高速になります

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

測定単位列挙は、承認ルーティングサービスに含まれています。 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;
    }
}

これが役立つことを願って...

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top