我的问题很简单。我需要能够计算一个带有标记类型的字符串值树。我找到了一个类似这样的方法来计算这些字符串。
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()))}]";
}
}
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+ })
如果你需要更多的上下文,请告诉我。谢谢!