タイトルで十分かもしれませんが、とにかく説明します。
私のアプリケーションは、ランダムなデータ ソースから「bool」や「double」などの文字列を取得します。その文字列を使用して、その文字列で指定されたタイプの実際のオブジェクトを作成することです。
したがって、「int」のような文字列は、int 型の新しいオブジェクトを提供します。
これは可能ですか?switch-case 構造を使用する例をいくつか見てきましたが、既に実装されている機能の方が見たいです。
前もって感謝します!
タイトルで十分かもしれませんが、とにかく説明します。
私のアプリケーションは、ランダムなデータ ソースから「bool」や「double」などの文字列を取得します。その文字列を使用して、その文字列で指定されたタイプの実際のオブジェクトを作成することです。
したがって、「int」のような文字列は、int 型の新しいオブジェクトを提供します。
これは可能ですか?switch-case 構造を使用する例をいくつか見てきましたが、既に実装されている機能の方が見たいです。
前もって感謝します!
文字列を完全修飾型にすることができれば、このようなことができます...
object num = Activator.CreateInstance(Type.GetType("System.Int32"));
Activatorクラスを使用して、特定のタイプのオブジェクトを作成できます。多くのメソッドがあり、そのうちのいくつかは文字列を使用してタイプを記述します。ただし、これint
は完全に修飾されたタイプではありませんが、使用する必要があります。System.Int32
Activator.CreateInstance
トリックを行うことができるはずです。
bool myVar = Activator.CreateInstance(Type.GetType("System.Boolean"));
はい、それは可能です-最も単純な実装は次のとおりです。
//case insensitive lookup and don't throw exception
Type t = Type.GetType(name, false, true);
if(t != null)
return Activator.CreateInstance(t);
これが、そこで使用しているオーバーロードに関するMSDNトピックですType.GetType
。
ただし、これには多くの欠点があることがすぐにわかりますname
。特に、問題の型のアセンブリ修飾型名である必要があります(mscorlibにある場合を除きます。この場合、名前空間修飾名だけで十分です)。また、デフォルトのコンストラクターが必要です(注-すべてオプションのパラメーターを持つコンストラクターはカウントされません)-しかし、それはおそらく合理的だと思います。
また、ジェネリックはこれで恐ろしいでしょう。しかし、可能です。
したがって、次のステップは、ショートカットが定義されているかどうかを確認するために最初に参照するマッピング辞書をstring
用意することです。Type
private Dictionary<string, Type> _knownTypes =
new Dictionary<string, Type>(StringComparer.OrdinalIgnoreCase);
private Type GetShortcutType(string name)
{
Type toReturn = null;
_knownTypes.TryGetValue(name, out toReturn);
return toReturn; //returns null if not found
}
これで、最初のコード例の型ルックアップ行を次のように変更できます。
Type t = GetShortcutType(name) ?? Type.GetType(name, false, true);
これで、エイリアスを設定するための設定方法ができました。これにより、次のことが可能になります。
_knownTypes["int"] = typeof(int);
_knownTypes["double"] = typeof(double);
ここでの型ルックアップの大文字と小文字を区別しないことが望ましい場合と望ましくない場合があることに注意してください。これは、システムをどれだけ簡単/柔軟にするかによって異なります。
これは確かにリフレクションで可能です。Activatorクラスは、指定された型のインスタンスを作成します。CreateInstance
文字列型名を使用するメソッド オーバーロードがあります。
パラメータのように を使用するActivator.CreateInstanceメソッドを使用できますType
。typeof(double)
動的キーワードを使用できます
string input = "int"
dynamic x = string.Empty;
switch(input)
{
case 'int':
x =34;
break;
case 'string':
x ="234";
break;
}