我有两种类型存储在字符串中,我需要获得这两种类型的结果:
"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"
变量...
我可以硬编码所有的可能性,但我正在寻找一种现有的方法来使用反射(或其他)来获得结果类型!
答案 0 :(得分:3)
不,不可能使用反射(或其他直接的东西)来获得&#34; x + y&#34;的类型。知道x和y的类型,因为它的编译器的工作是查找在这种情况下实际将被调用的方法(包括通过所有隐式转换和重载操作符的正确搜索)。
选项:
default(Type)
是获取样本值的方法double
dynamic
获取类型((((dynamic)x) + y).GetType()
),您需要弄清楚如何获取string
等参考类型的非空样本值答案 1 :(得分:1)
一种选择可能是存储一组样本数据&#39;对于每个相关类型,然后使用您要查找的组合进行实际操作。
作为示例(仅展示string
和float
,但可扩展到所有相关类型):
// 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());