C#获取运算符结果类型

时间:2017-12-03 05:01:56

标签: c# .net

我有两种类型存储在字符串中,我需要获得这两种类型的结果:

"test" + 2 // would give "string"  
2 - 2.2f // would give "float"  

依旧......
如果其中一个不是原始字符串或字符串(如System.DateTime),我已经可以这样做了,但我找不到怎么做(干净)...... 我现在得到的最佳镜头是在运行时构建这两个方法并调用“GetResultType”方法:

Type GetTemplateType<T>(T? t) where T: struct => typeof(T);
Type GetResultType() => GetTemplateType(true ? null : ((int?)null) + ((double?)null));

上面代码中的“int”和“double”将在生成的代码中进行硬编码,因此它基本上依赖编译器来解析类型。
我觉得这个方法有点难看,所以我想知道是否会有一个更干净的方法呢?

编辑:

我没有变量的值。我正在构建一个可视化编程接口,所以我需要知道添加两个变量的结果类型,而不知道这些变量的值。我基本上需要这样的方法:

string GetResultingTypeOfAddition( string type1, string type2 ) { ... }
...
var type = GetResultingTypeOfAddition(node1.Type, node2.Type); 

当然,所有"string"变量也可以是"System.Type"变量...
我可以硬编码所有的可能性,但我正在寻找一种现有的方法来使用反射(或其他)来获得结果类型!

2 个答案:

答案 0 :(得分:3)

不,不可能使用反射(或其他直接的东西)来获得&#34; x + y&#34;的类型。知道x和y的类型,因为它的编译器的工作是查找在这种情况下实际将被调用的方法(包括通过所有隐式转换和重载操作符的正确搜索)。

选项:

  • 您可以复制管理运营商选择的编译器规则(硬)
  • 编译源代码,在运行时使用所需参数调用运算符并检查结果类型(default(Type)是获取样本值的方法
  • 如果您对类型的选择有限,您可以简单地对所有可能性进行硬编码并存储在词典中
  • 反向问题并将可用运算符的限制设置为您已知道的结果 - 例如在调用运算符之前将所有数字类型转换为double
  • 看看您是否可以使用dynamic获取类型((((dynamic)x) + y).GetType()),您需要弄清楚如何获取string等参考类型的非空样本值

答案 1 :(得分:1)

一种选择可能是存储一组样本数据&#39;对于每个相关类型,然后使用您要查找的组合进行实际操作。

作为示例(仅展示stringfloat,但可扩展到所有相关类型):

// Setup sample data (keyed by Type, but could be Type's FullName or whatever really)
Dictionary< Type, object> exampleTypes = new Dictionary<Type, object>();
exampleTypes.Add(typeof(string), "a");
exampleTypes.Add(typeof(float), 1.0f);

// Get two bits of sample data
dynamic first = exampleTypes[typeof(string)];
dynamic second = exampleTypes[typeof(float)];

// Apply calculation you are interested in
dynamic bob = first + second;

// OK, float + string results in string
Console.WriteLine(bob.GetType());