2017-12-03 96 views
-1

我存储在字符串两种类型,我需要得到所产生的加/师型/ ...他们两个:C#获取运营商造成型

"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"变量...
我可能已经硬编码的一切准备,但我一直在寻找一个现有的办法使用反射(或其他)来得到最终的类型!

+1

哎你能在问候你'字符串+ int'和'INT给代码一个更好的例子 - 浮动'谢谢 – MethodMan

+0

你可以在实际代码中显示如何为变量赋值并且它的类型为“test”+ 2 //会给“字符串”,显示实际代码不是字符串+ int值.. – MethodMan

+0

如果你是谁决定结果类型应该是什么,你可以在字典中硬编码它,使用键类型和返回类型作为值' – Dido

回答

1

一个选项可能是为每个相关类型存储一组“样本数据”,然后用您正在查找的组合进行实际操作。

为例(只显示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()); 
+0

我将其标记为接受,因为至少它不需要硬编码所有15 * 15种可能性,而只需要一个15个值的数组。谢谢! – pascx64

3

不,不可能使用反射(或其他简单的方法)来获得知道x和y类型的“x + y”类型,因为编译器的工作是找到实际上在这种情况下将被调用的方法包括正确搜索所有隐式转换和重载运算符)。

选项:

  • 可以复制支配运营商选择(硬)
  • 与呼叫与所需的参数操作员在运行时,检查结果的类型(default(Type)编译源代码编译的规则是这样的获取样本值
  • 如果您对类型的选择有限,则可以简单地对所有可能性进行硬编码并存储在字典中
  • 反向问题并将可用运算符的集合限制为您已知的某些结果在调用运算符
  • 之前,请将所有数字类型转换为double,看看您是否可以使用dynamic来获得类型((((dynamic)x) + y).GetType()),那么您需要弄清楚如何为参考类型(如string)获取非空样本值。