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

计量单位枚举包含在审批路由服务中。为了详细说明 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 回答