2017-05-17 7 views
1

私は動的にコンパイルエラーを取得するオブジェクトにC#の解決タイプ

var type = Type.GetType("Demo.Namespace.AnimalViewModel, Demo.Assembly", true); 
var fooType = Type.GetType("Demo.Namespace.Foo, Demo.Assembly", true); 
Activator.CreateInstance(type) as AnimalViewModel<fooType>; 

を作成するためにリフレクションを使用しています:

私はfooTypeで、AnimalViewModelのためのタイプを設定するにはどうすればよい

'fooType' is a variable but is used like a Type.

変数? fooType - > Foo

+3

あなたのリフレクションバージョンでは 'obj'と何が期待されますか?コードを使用する予定のコードの例を示してください。 –

+1

あなたがしたいことはできないかもしれません。一方、ビューモデルを 'IAnimalViewModel'を実装し、その型を通して参照することで、同じことを達成することができます。 – recursive

+0

私はシナリオについて少し混乱しています。 3行目がコンパイルされると、リフレクションを使わずに 'AnimalViewModel'が既に静的に利用可能になります。なぜそれに頼るの? – recursive

答えて

1

正しく、<>に入るタイプ情報はコンパイル時の参照です。私。型を記述する変数Typeを保持する変数ではなく、型自体です。これは、ここでの型が解決され、実行時ではなくコンパイル時に発生するためです。答えhttps://stackoverflow.com/a/2173115/1556108

見て、特にセクション:

Type unboundGenericList = typeof(List<>); 
Type listOfInt = unboundGenericList.MakeGenericType(typeof(int)); 
if (listOfInt == typeof(List<int>)) 
    Console.WriteLine("Constructed a List<int> type."); 

あなたが実行時にあなたのタイプを構築しているので、あなたは同じアプローチを使用する必要があります。線に沿って何か:

var type = Type.GetType("Demo.Namespace.AnimalViewModel, Demo.Assembly", true); 
var fooType = Type.GetType("Demo.Namespace.Foo, Demo.Assembly", true); 
var closedType = fooType.MakeGenericType(fooType) 
var closedInstance = Activator.CreateInstance(closedType); 

そして、あなたが本当にためにそれをキャストすることはできませんコンパイル時あなたがロードされた型は、コンパイル時の既知のタイプから派生していることを保証することができない限り、既知のタイプ、。ダイナミックな型指定はまさにそのことです。実行時に動的にそれを処理します。

関連する問題