0

クラスのジェネリックパラメーターで指定された型を検出する方法はありますか?

たとえば、次の3つのクラスがあります。

public class Customer
{ }

public class Repository<T>
{ }

public class CustomerRepository : Repository<Customer>
{ }

public class Program
{
    public void Example()
    {
        var types = Assembly.GetAssembly(typeof(Repository<>)).GetTypes();
        //types contains Repository, and CustomerRepository
        //for CustomerRepository, I want to extract the generic (in this case, Customer)
    }
} 

戻されたリポジトリオブジェクトごとに、どのタイプが指定されているかを確認できるようにしたいと思います。
それは可能ですか?

編集

@CuongLeのおかげで、これは機能していますが、乱雑に見えます....(resharperの助けもあります;))

var types = Assembly.GetAssembly(typeof(Repository<>))
 .GetTypes()
 .Where(x => x.BaseType != null && x.BaseType.GetGenericArguments().FirstOrDefault() != null)
 .Select(x => x.BaseType != null ? x.BaseType.GetGenericArguments().FirstOrDefault() : null)
 .ToList();
4

2 に答える 2

2

CustomerRepositoryタイプのリストから選択して、タイプを保持していると仮定します。

var customerType = typeof(CustomerRepository).BaseType
                          .GetGenericArguments().First();

編集: Re-Sharperを100%信頼する必要はありません。ではないWhereタイプをすべて選択するので、再度チェックインする必要はありません。詳細については、実際に戻ります。このコードは最適化されています。BaseTypenullSelectFirstOrDefaultnull

 Assembly.GetAssembly(typeof(Repository<>))
                  .GetTypes()
                  .Where(x => x.BaseType != null)
                  .Select(x => x.BaseType.GetGenericArguments().FirstOrDefault())
                  .ToList();
于 2012-09-17T16:36:29.283 に答える
1

を使用してみてくださいGetGenericArguments

于 2012-09-17T15:58:02.977 に答える