2017-12-03 16 views
-1

私は、文字列に格納された2つの種類があると私はほか/部門/ ...両者の結果の型を取得する必要がある結果取得:C#の演算子はタイプ

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

などを...
を それらのうちの1つがプリミティブでも文字列でもない場合(System.DateTimeのように)、私はそれを行う方法を見つけることができません。(クリーン) ベストショット実行時にこれらの2つのメソッドを作成し、 "GetResultType"メソッドを呼び出すことです:

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

上記のコードの "int"と "double"は生成されたコードにハードコードされているため、本質的にコンパイラに依存して型を解決します。
私はこの方法を少し醜いので、それを行うよりクリーンな方法があるのだろうかと思いましたか?

編集:

私は変数の値を持っていません。私はビジュアルプログラミングインターフェイスを構築しているので、これらの変数の値を知らずに2つの変数を追加する結果の型を知る必要があります。もちろん、すべての"string"変数はまた、私はハードすべての可能性をコード化されていたかもしれないが、私は、既存の方法に探していた
"System.Type"変数...することができ、オフ

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

:私はこのような方法を必要とする本質的でしょう結果の型を取得するためにリフレクション(または何でも)を使用してください!

+1

ねえ、あなたの 'の文字列+ int'と' int型に関してのコードでは、より良い例を与えることができます - フロート'thanks – MethodMan

+0

実際のコードで変数に値を割り当てる方法と、' 'test" + 2 // "string"とし、実際のコードではなく文字列+ int値を表示することができますか? – MethodMan

+0

結果の型を決定する人は、キーで型を使用し、型で値を返すように辞書でハードコーディングすることができます – Dido

答えて

1

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)は方法ですサンプル値を取得する
  • タイプの選択肢が限られている場合は、すべての可能性をハードコードして辞書に保存することができます。
  • 逆問題があります。あなたがdynamicを使用してタイプ((((dynamic)x) + y).GetType())を取得できるかどうかを確認するには、stringのような参照型のnull以外のサンプル値を取得する方法を理解する必要があります。