代码之家  ›  专栏  ›  技术社区  ›  ComedicChimera

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

  •  0
  • ComedicChimera  · 技术社区  · 6 年前

    我的问题很简单。我需要能够计算一个带有标记类型的字符串值树。我找到了一个类似这样的方法来计算这些字符串。

    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树。有人认为一个方法可以返回多个类型而不显式地提供它吗?或者有什么方法可以断言类型定义了某些运算符?就像在里面一样,

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

    如果你需要更多的上下文,请告诉我。谢谢!

    0 回复  |  直到 6 年前