2

リストにマップしたいリストがあります。ただし、コンパイラエラーはありませんが、実行時に結果がnullになります。ジェネリックを取得するList<T>と、コードをジェネリックにして、さまざまなオブジェクトで再利用するのに役立ちます。

private static List<T> GetIndexData(DataAdapter dataAdapter)
{
  Type type = typeof(T);
  List<T> result = new List<T>();

  if (typeof(Category).IsAssignableFrom(typeof(T)))
  {
    var output = ItemStoreDataManager.GetAllCategoryNames(dataAdapter);                
    result = output as List<T>;                    
  }
  return result;
}

上記のコード結果はnullとして表示されます。

internal static List<Category> GetAllCategoryNames(DataAdapter dataAdapter)
{
  List<Category> result = new List<Category>();

  ...........
  return result;
}

助けてください。

ありがとう

4

2 に答える 2

9

エラーは次のコード行にあります。

result = output as List<T>;

C#では、演算子List<TSomething>List<TSomethingElse>使用してにキャストすることはできません。MSDNで指定された理由asで値が表示されています...null

as演算子は、キャスト操作のようなものです。ただし、変換が不可能な場合は、例外を発生させる代わりにnullを返します。

as演算子は、参照変換とボクシング変換のみを実行することに注意してください。as演算子は、ユーザー定義の変換などの他の変換を実行できません。代わりに、キャスト式を使用して実行する必要があります。

foreachオプションは、ループを使用してアイテムごとに新しいリストを作成するか、Enumerable.Cast(from System.Linq)を使用してこれを実行することです。

output.Cast<T>().ToList();
于 2012-12-31T13:20:08.190 に答える
2

タイプ別に特化している場合、率直に言ってジェネリックは最良の選択ではないかもしれません。Typeインスタンスを取得し、非ジェネリックを返すIList方が適切かどうか疑問に思います。ただし、型の等式を使用する場合は、次の方法でキャストできますobject

if (typeof(Category) == typeof(T))
{
    var output = ItemStoreDataManager.GetAllCategoryNames(dataAdapter);
    result = (List<T>)(object)output;
}

あなたがにうるさいならIsAssignableFrom、それははるかに難しいです。aをa (またはその逆)にキャストするList<SuperCategory> ことはできません。新しいList<Category>リストを作成するか(Richard Evの回答を参照)、または使用することできます(分散をサポートします)。IEnumerable<Category>

于 2012-12-31T13:20:57.997 に答える