2

タイトルで十分かもしれませんが、とにかく説明します。

私のアプリケーションは、ランダムなデータ ソースから「bool」や「double」などの文字列を取得します。その文字列を使用して、その文字列で指定されたタイプの実際のオブジェクトを作成することです。

したがって、「int」のような文字列は、int 型の新しいオブジェクトを提供します。

これは可能ですか?switch-case 構造を使用する例をいくつか見てきましたが、既に実装されている機能の方が見たいです。

前もって感謝します!

4

7 に答える 7

6

文字列を完全修飾型にすることができれば、このようなことができます...

object num = Activator.CreateInstance(Type.GetType("System.Int32"));
于 2012-11-26T10:12:34.953 に答える
4

Activatorクラスを使用して、特定のタイプのオブジェクトを作成できます。多くのメソッドがあり、そのうちのいくつかは文字列を使用してタイプを記述します。ただし、これintは完全に修飾されたタイプではありませんが、使用する必要があります。System.Int32

于 2012-11-26T10:11:45.623 に答える
3

Activator.CreateInstanceトリックを行うことができるはずです。

bool myVar = Activator.CreateInstance(Type.GetType("System.Boolean"));
于 2012-11-26T10:19:48.617 に答える
0

はい、それは可能です-最も単純な実装は次のとおりです。

//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);

ここでの型ルックアップの大文字と小文字を区別しないことが望ましい場合と望ましくない場合があることに注意してください。これは、システムをどれだけ簡単/柔軟にするかによって異なります。

于 2012-11-26T10:17:52.957 に答える
0

これは確かにリフレクションで可能です。Activatorクラスは、指定された型のインスタンスを作成します。CreateInstance文字列型名を使用するメソッド オーバーロードがあります。

于 2012-11-26T10:15:27.570 に答える
0

パラメータのように を使用するActivator.CreateInstanceメソッドを使用できますTypetypeof(double)

于 2012-11-26T10:13:29.440 に答える
0

動的キーワードを使用できます

string input = "int"
dynamic x = string.Empty;

switch(input)
{
case 'int':
x =34;
break;
case 'string':
x ="234";
break;
}
于 2012-11-26T10:14:04.010 に答える