2017-12-03 90 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)獲取非空樣本值。