3

次のように繰り返しコードをラップすることは可能でしょうか?

IList<Bla1> Bla1s = (from a in Containers
       where a.Right.GetType().Name.Equals("Bla1")
select
(
  (Bla1) a.Right
)).Distinct().ToList<Bla1>();

一般的な構造(メソッド?)に。多くの Blas (Bla1、Bla2 ...) があります。Bla は T を表すと思いますが、そのような状況でのジェネリックの経験はあまりありません。ありがとう。

4

2 に答える 2

7

タイプ名だけでなくタイプをテストしたい場合は、次のことができます。

IList<T> items = Containers.Select(c => c.Right).OfType<T>().Distinct().ToList();

したがって、ジェネリック メソッドは次のようになります。

IList<T> GenericMethod<T>()
{
    return Containers.Select(c => c.Right).OfType<T>().Distinct().ToList();
}

コメントで hvd が言及されているように、上記のコードRightは、から派生した型の要素も返しますT。タイプのみをフィルタリングすることが意図されている場合はT、代わりにこれを使用します。

IList<T> GenericMethod<T>(IEnumerable<Container> containers)
{
    return containers.Select(c => c.Right)
        .Where(x => x.GetType() == typeof(T)).Cast<T>()
        .Distinct().ToList();
}
于 2012-10-31T13:53:18.263 に答える
5

使用する文字列が常にクラス名と正確に等しい場合は、はい。

IList<T> Bla1s = (from a in Containers
       where a.Right.GetType().Name.Equals(typeof(T).Name)
select
(
  (T) a.Right
)).Distinct().ToList<T>();

または、文字列を完全に削除します。

IList<T> Bla1s = (from a in Containers
       where a.Right.GetType().Equals(typeof(T))
select
(
  (T) a.Right
)).Distinct().ToList<T>();
于 2012-10-31T13:51:32.473 に答える