4

クラスを動的に作成しました (ここで見つかりました) が、それを使用してリストを作成できない理由がわかりません。

var myType = CompileResultType();
var myObject = Activator.CreateInstance(myType);
var myList = new List<myObject>();

// Error: The type or namespace name 'myObject' 
// could not be found (are you missing a using directive 
// or an assembly reference?)

どうすればいいですか?

4

5 に答える 5

8

これらは、インスタンスではなく型を想定しているため、ジェネリック型パラメーターと呼ばれます。したがって、実際の型を知るか、リフレクションを使用してリスト オブジェクトを作成する必要があります。

Type listType = typeof(List<>);
Type dynamicClassType = listType.MakeGenericType(myObject.GetType());
object myList = Activator.CreateInstance(dynamicClassType);

ただし、インスタンスはオブジェクトであるため、意味のある方法で使用することはできません。

  • Avner Shahar-Kashtan の回答IListで提案されているようにキャストし、非ジェネリック メソッドを使用できます。

    IList myList = (IList)Activator.CreateInstance(dynamicClassType);
    
  • リフレクションを通じてリストインスタンスのメソッドを呼び出すこともできます。

    // roughly
    MethodInfo addMethod = myList.GetType().GetMethod("Add");
    addMethod.Invoke(myList, objectToAdd);
    
  • または、Cuong Le's answerdynamicで提案されているようにして、リストインスタンスのタイプとして使用します。

    dynamic myList = Activator.CreateInstance(dynamicClassType);
    
于 2013-07-23T06:13:59.783 に答える
6

ジェネリック型を動的に構築するには、リフレクション、特にMakeGenericTypeメソッドを使用する必要があります。このようなもの:

Type baseListType = typeof(List<>); // get the generic List<>
Type myType = CompileResultType; // same as in yours.
Type myListType = baseListType.MakeGenericType(myType); // Get the List<MyType>
IList myList = (IList)Activator.CreateInstance(myListType); // Instantiate.

コンパイル時の型がないため、myListとして定義したことに注意してください。IList幸いなことに、 のような便利な基本クラスとインターフェイスIList、および実装するIEnumerable他のいくつかのクラスがあり、それらを使用できます。List<T>

于 2013-07-23T06:14:29.247 に答える
2

ジェネリック型には、インスタンスではなくクラスの型が必要です。おそらく次のものが必要です。

var myType = CompileResultType();
var listType = typeof (List<>).MakeGenericType(myType);
var myList = Activator.CreateInstance(listType);

しかしmyList、ここではobject、リストにアイテムを追加または削除したい場合は、次を利用する必要がありますdynamic

dynamic myList = Activator.CreateInstance(listType);

したがって、次のように呼び出すことができます。

myList.Add(...);
于 2013-07-23T06:14:09.620 に答える
1

これはリストのタイプを作成しますList<WhatEverIsInMyType>

var listType = typeof(List<>).MakeGenericType(myType);

インスタンスを作成する必要がありますが、次のことをカバーしました。

var list = Activator.CreateInstance(listType);

残念ながら、リフレクションを使用しているため、コンパイル時に正確な型はわかりませんが、すべてが失われるわけではありません。非ジェネリック型を使用できます。

    var list = (IList)Activator.CreateInstance(listType);

リストを使用するようなメソッドを使用できるようAdd Removeになりましたが、タイプが計算されない場合は実行時例外が発生するため注意してください。

于 2013-07-23T06:15:38.013 に答える
0

インスタンスではなく、タイプを操作します。返品を想定:CompileResultType()MyType

MyType myType = CompileResultType();
List<MyType> list = new List<MyType>();

何のために使っているのかは不明ですActivator.CreateInstance()が…

于 2013-07-23T06:14:17.690 に答える