断言C#类型定义了一个运算符

时间:2019-01-31 17:39:18

标签: c# .net

我的问题很简单。我需要能够评估带有标记类型的字符串值树。我发现了一种看起来像这样的方法来评估那些字符串。

private static ITypeNode _evaluateExpr(ExprNode node)
{
    switch (node.Name)
    {
        case "ChangeSign":
            {
            var val = _convertToCSharpType(node.Type, ((ValueNode)node.Nodes[0]).Value);

            string newVal = "";
            if (val is int)
                 newVal = (-(int)val).ToString();
            else if (val is long)
                 newVal = (-(long)val).ToString();
            else if (val is float)
                 newVal = (-(float)val).ToString();
            else if (val is double)
                 newVal = (-(double)val).ToString();

            return new ValueNode(newVal, node.Type);
            }
      }
}

convertToCSharpType方法基于提供的节点返回对象类型。 (此对象类型包含已转换类型的基础类型) 该开关上有大多数分支,我只是没有添加它们。

对于其他两个类:

class ExprNode : TreeNode, ITypeNode
{
    public string Name { get; }
    public IDataType Type { get; set; }

    public ExprNode(string name, IDataType type)
    {
        Name = name;
        Type = type;
        Nodes = new List<ITypeNode>();
    }

    public ExprNode(string name, IDataType type, List<ITypeNode> nodes)
    {
        Name = name;
        Type = type;
        Nodes = nodes;
    }

    public override string ToString()
    {
        return $"{Name}:[{string.Join(", ", Nodes.Select(x => x.ToString()))}]";
    }
}

// stores literal values
class ValueNode : ITypeNode
{
    public string Name { get; }
    public IDataType Type { get; set; }

public string Value;

    public ValueNode(string name, IDataType type)
    {
        Name = name;
        Type = type;
    }

    public ValueNode(string name, IDataType type, string value)
    {
        Name = name;
        Type = type;
        Value = value;
    }

    public override string ToString()
    {
        return $"Value({Name}, {Type}, {Value})";
    }
}

ITypeNode只是一个接口,它定义的所有节点必须具有的某些方法,而TreeNode只是表明这些类具有子节点。 (它为他们提供了List<ITypeNode> Nodes属性)

我的问题是,有没有一种方法可以避免拥有需要评估的每个运算符的if-tree。是否有人可以在不显式提供方法的情况下返回多种类型?还是有人断言类型定义了某些运算符?就像

(obj as interface { operator+ }) + (obj2 as interface { operator+ })

有这种可能吗?

如果您需要更多背景信息,请告诉我。谢谢!

0 个答案:

没有答案