2

リストを作成する必要がありますが、クラス名しか知りません

public void getList(string className)
{

 IList lsPersons = (IList)Activator.CreateInstance(
        typeof(List<>).MakeGenericType(Type.GetType(className))));

}

非常に多くの方法を試しましたが、何もうまくいきません。

4

1 に答える 1

1

一般的なリストを作成できますが、役に立ちません。generic が必要な場合は、必要な型に関する事前の知識をList<T>どこかに組み込む必要があります。たとえば、次のようなことができます。

if(className == "Employee") // this is where your prior knowledge is playing role
{ 
    IList<Employee> lsPersons = (IList<Employee>)Activator.CreateInstance(
             typeof(List<Employee>).MakeGenericType(Type.GetType(className))));
}

また、次のような方法で任意のタイプの一般的なリストを作成できます。

public static class GenericListBuilder
{
    public static object Build(Type type)
    {
       var obj = typeof(GenericListBuilder)
                .GetMethod("MakeGenList", BindingFlags.Static|BindingFlags.NonPublic)
                .MakeGenericMethod(new Type[] { type })
                .Invoke(null, (new object[] {}));
       return obj;
    }

    private static List<T> MakeGenList<T>()
    {
       return new List<T>();
    }
}

そして、それを次のように消費することが可能です:

var List<Employee> = GenericListBuilder.Build(typeof(Employee)) as List<Employee>;

また

IList list = GenericListBuilder.Build(Type.GetType(className)) as IList;

最後の行は完全に盲目的で、あなたが考えているものに非常に近いと思います。しかし、それは何か利点がありますか?思わない。

于 2013-10-02T16:52:58.423 に答える