9

私はこのようないくつかのクラスを持っています:

public class Customer
{ }

public interface IRepository 
{ }

public class Repository<T> : IRepository
{ }

public class CustomerRepository<Customer>
{ }

次に、この質問への回答に従って、リフレクションを使用して、各 *Repository のジェネリックによって参照される型のリストを取得できます。

私が終わらせたいのはDictionary<Type, IRepository>

これまでのところ、私はこれを持っています:

Dictionary<Type, IRepository> myRepositories = Assembly.GetAssembly(typeof(Repository<>))
.GetTypes()
.Where(typeof(IImporter).IsAssignableFrom)
.Where(x => x.BaseType != null && x.BaseType.GetGenericArguments().FirstOrDefault() != null)
.Select(
    x =>
    new { Key = x.BaseType != null ? x.BaseType.GetGenericArguments().FirstOrDefault() : null, Type = (IRepository)x })
.ToDictionary(x => x.Key, x => x.Type);

ただし、私のキャストが好きではありません(IRepository)x
。次のエラーが表示されます。

タイプ 'System.RuntimeType' のオブジェクトをタイプ 'My.Namespace.IRepository' にキャストできません。

4

2 に答える 2

13

(IRepository) typetype is Typeclass でキャストすることはできません。

を使用Activator.CreateInstanceして object を作成できますCustomerRepository。また、を使用する必要はSelectなく、代わりにToDictionary以下のコードを直接使用します。

var myRepositories = Assembly.GetAssembly(typeof(Repository<>))
       .GetTypes()
       .Where(x => x.BaseType != null && 
                   x.BaseType.GetGenericArguments().FirstOrDefault() != null)

       .ToDictionary(x => x.BaseType.GetGenericArguments().FirstOrDefault(), 
                            x => Activator.CreateInstance(x) as IRepository );
于 2012-09-17T18:21:09.540 に答える
3

if xisSystem.Typeオブジェクトの場合、 if xistypeof(Repository<>)のように、そのようにキャストすることはできません。はTypeインスタンス化ではありません。

x「フリー」型パラメーターがない場合、つまり、x非ジェネリックまたは閉じたジェネリック(IRepository)Activator.CreateInstance(x)の場合は、 type のオブジェクトを作成する可能性がありますx。しかし、それがあなたが必要としているものかどうかはわかりません。パラメーターなしのインスタンス コンストラクターはありますか?

于 2012-09-17T18:21:16.907 に答える