在C#中确定如何将对象转换为适当类型的最佳方法是什么?

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”属性的转换方法?

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
}

我在.NET框架中找不到ClassCastException异常类型。C#中的等效类型是什么? - Michael Kniskern
我使用了这个解决方案将对象转换为适当的类型...感谢您的输入。 - Michael Kniskern
抱歉...ClassCastException是Java的名称。我已经更新了原始答案。 - JSBձոգչ

1

你从哪里获取测量单位?我看到了枚举,但是在API的其他地方没有找到任何关于它的引用。

假设你确实从某个地方获取它,最简单的解决方案可能就是使用 switch 语句。虽然有点丑陋,但:

  • 它能工作
  • 容易理解
  • 它会很快

不过,我仍然不完全确定我是否理解了问题的所有内容 - 特别是因为你没有解释投射后其他对象将用于什么。


1

度量单位枚举包含在审批路由服务中。更详细地说,规则类被用作所有其他类型规则的基类。它松散地基于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;
    }
}

希望这有所帮助...

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接