我的问题很简单。我需要能够评估带有标记类型的字符串值树。我发现了一种看起来像这样的方法来评估那些字符串。
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+ })
有这种可能吗?
如果您需要更多背景信息,请告诉我。谢谢!