2012-02-23 25 views
4

クラス名文字列を使用してクラス名/タイプを取得するにはどうすればよいですか?以下のような反射を使用してジェネリッククラスへのフィードを取得する

Dictionary<string, string> DFields = GetFields(); 

タイプが理想的には、私が考えていた

Dictionary<string, string> 
object = Deserialize<?>(_stream) 

です:

object = Deserialize<"Dictionary<string, string>">(_stream) 

それを動作させるために、

object = Deserialize<Dictionary<string, string>>(_stream) 

になるはずです。私は10オブジェクトのようなシリアル化が、私は文字列形式の型名があります。私はそれを汎用シリアルシリアライザのデシリアライザ関数に送ることができるように、文字列形式を実際の形式にフォーマットする必要があります。

答えて

3

ステップ1 - タイプのインスタンスを取得します。

あなたはType.GetType()に渡されるアセンブリ修飾名を使用する必要があります。

System.Collections.Generic.Dictionary`2 [[可能System.String、mscorlib、バージョン= 4.0.0.0:インスタンスを入力します)(辞書にGetType().AssemblyQualifiedNameを呼び出すことにより、簡単なテストを行う 、それがあることが判明します、Culture =ニュートラル、PublicKeyToken = b77a5c561934e089]、[System.String、mscorlib、バージョン= 4.0.0.0、Culture =ニュートラル、PublicKeyToken = b77a5c561934e089]]、mscorlib、バージョン= 4.0.0.0、Culture =ニュートラル、PublicKeyToken = b77a5c561934e089

かなり混乱します。私はあなたががそれの大部分を除去することができ、それはまだ動作します信じる:

System.Collections.Generic.Dictionary`2 [[可能System.String、mscorlib]、[可能System.String、mscorlib]]、mscorlib

その:

var typeName = "System.Collections.Generic.Dictionary`2[[System.String, mscorlib],[System.String, mscorlib]], mscorlib"; 
var type = Type.GetType(typeName); 

ステップ2(APIを仮定すると、IMOがクソであるジェネリックパラメータを強制) - 動的ジェネリックメソッドparametizeために使用反射:

var genericMethod = typeof(Serialzier).GetMethod("Deserializer"); 
var parametizedMethod = genericMethod.MakeGenericMethod(type); 
var parameters = new object[] { _stream }; 
var deserializedInstance = parametizedMethod.Invoke(null, parameters); 
+1

いいえ、私はDictionary のように "Dictionary "のような文字列しか持っていません。この文字列をDictionary のような実際の型に変換する必要があります。それは実際の実数型の文字列型になるはずです。 – iefpw

+0

申し訳ありません、それを持っています。編集を参照してください。 – Tyson

+0

object.Deserialize ")>();を実行しようとすると、それは言う:演算子 '<'は、 'メソッドグループ'と 'System.Type'タイプのオペランドに適用することはできません – iefpw

関連する問題