2016-09-15 3 views
4

をタイプします:私はそのような一般的なタイプのフルネームからタイプを取得したいと思いジェネリック型のフルネームから

var myType = Type.GetType("MyProject.MyGenericType`1[[MyProject.MySimpleType, MyProject, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]"); 

しかし、そのようなジェネリック型で動作しないようです...

は何ですかそれを行う良い方法は?

+0

あなたは正しい、 "<" を閉じるためのもの?もしそうでなければ、それは最初のエラーです。 – piojo

答えて

3

アセンブリ修飾名を指定しない場合、Type.GetTypemscorlibタイプのみで動作します。あなたの例では、埋め込まれた型引数のためだけにAQNを定義しています。

// this returns null: 
var type = Type.GetType("MyProject.MyGenericType`1[[MyProject.MySimpleType, MyProject, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]"); 

// but this works: 
var type = Type.GetType("MyProject.MyGenericType`1[[MyProject.MySimpleType, MyProject, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]], MyProject, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"); 

あなたの代わりにType.GetTypeAssembly.GetTypeを使用している場合あなたのオリジナルの文字列型は、しかし動作します:

var myAsm = typeof(MyGenericType<>).Assembly; 
var type = myAsm.GetType("MyProject.MyGenericType`1[[MyProject.MySimpleType, MyProject, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]"); 
+0

あなたの最初の解決策はうまくいくようです!しかし、ジェネリック型のAQNを使って、ジェネリック型のフルネームを取得するにはどうすればいいですか? – k4st0r42

+0

私の返事を見てください。ジェネリック型の場合は通常どおり、 '[]'で囲む場合は汎用引数として指定できます。 – kiziu

+1

'typeof(MyGenericType )。AssemblyQualifiedName'はAQNを返します – taffer

3

このお試しください:オープンジェネリック型はコンパイル型で判断することができるならば、あなたは、単に<>typeof演算子を使用することができますまた

var finalType = myType.MakeGenericType(Type.GetType("MyProject.MySimpleType")); 

MakeGenericType()を使用すると

var myType = Type.GetType("MyProject.MyGenericType`1, MyProject, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]"); 

var myType = typeof(MyProject.MyGenericType<>); 
var finalType = myType.MakeGenericType(typeof(MyProject.MySimpleType)); 

MSDN

+0

"MyProject.MyGenericType'1 [[MyProject.MySimpleType、MyProject、Version = 1.0.0.0、Culture =ニュートラル、PublicKeyToken = null]]" – k4st0r42

+0

@ k4st0r42の汎用タイプのパラメータを実装した汎用タイプの文字列のみを実装しています。私はそれに応じて私の答えを改訂した。しかし、もし 'string'があれば@kiziuの方が簡単かもしれません。 – haim770

3

最も簡単な方法は「リバースエンジニアリング」を試みることです。

たとえば、

typeof(List<int>) 

あなたは

System.Collections.Generic.List`1[System.Int32] 

を取得あなたはそのように

Type.GetType("System.Collections.Generic.List`1[System.Int32]") 

を呼び出すと、あなたに適切な型を与える、テンプレートとしてこれを使用することができます。

の後にある数字は、総称引数の数で、カンマをセパレータとして使用して[]にリストされます。

EDIT:どのタイプのFullNameを見てみると、アセンブリの指定中にタイプを処理する方法がわかります。最終結果はもちろん

Type.GetType("System.Collections.Generic.List`1[[System.Int32, mscorlib]], mscorlib") 

になるので、それはあなたがそれを必要とする場合は、また、バージョン、カルチャと公開キートークンを指定することができ、余分な[]タイプを包む必要になります。

+0

申し訳ありませんが、コピー/貼り付けのエラーです。メッセージを編集しました...これは私が使用する方法ですが、私のタイプでは機能しません... – k4st0r42

+0

タイプ名を正しく指定していますか? 'Type.GetType()'を使って両方の型を別々に取得できますか? – kiziu

関連する問題