2

一般的な方法でリストに追加できるクラスのインスタンスを作成しようとしています。

type作成する必要のあるクラスのを知っておりobject、以下のコードを使用してクラスのを作成できましたが、これをリストに追加できるキャストを作成する方法が見つかりませんでした。アイデア?

TはobjTypeと同じです

public static List<T> LoadList(string fileName, Type objType)
{
    List<T> objList = new List<T>();
    object o = Activator.CreateInstance(objType);
    objList.Add((**o.GetType()**)o);
    return objList;
}

これを行うためのより良い方法がある場合は、アイデアに対してあまりにもオープンです:)

4

3 に答える 3

5

非汎用APIを使用するだけです。

((IList)objList).Add(o);

typeまた、これはジェネリック型パラメーターであると想定しています。言うまでもなくtype、これは混乱を招きます。TまたはTSomethingSpecificもっと慣用的になります。

また:この行は修正が必要です:

List<type> objList = new List<type>(); // <=== not new List<Object>
于 2012-12-07T08:37:41.920 に答える
2

それ<type>がと同じであるとするとobjType、リフレクションを削除し、where T:new()タイプの制約を使用することをお勧めします。

public static List<T> LoadList(string fileName) 
    where T : new()
{
    List<T> objList = new List<T>();
    objList.add(new T());
    return objList;
}

編集:

objTypeがのサブクラスである場合T、これらの線に沿った何かが機能するはずだと思います。

public static List<TListType, T> LoadList(string fileName)
    where T : TListType, new()
{
    List<TListType> objList = new List<TListType>();
    objList.add(new T());
    return objList;
}
于 2012-12-07T08:45:46.907 に答える
1

whereタイプの重複する指定を排除するため、制約を使用してZachJohnsonの提案を使用できます。ただし、署名が石で設定されている場合は、次asのような単純なキャストでうまくいく可能性があります。

public List<T> LoadList<T>(Type objType) where T : class
{
  List<T> objList = new List<T>();
  T item = (Activator.CreateInstance(objType) as T);
  objList.Add(item);
  return objList;
}

型にキャストするには、その型が参照型(別名クラス)である必要があるため、これにはwhere制限も必要です。

于 2012-12-07T09:35:09.147 に答える