1

Tから継承するダースのタイプを言いました。私は一般的な次のインターフェイスを持っていますEntityObjectIDataObject

IDataManager<T> where T : EntityObject, IDataObject ...

データマネージャーの基本クラスもあります

BaseDataManager<T> : IDataManager<T> where T : EntityObject, IDataObject ....

そして私は特定のクラスを持っています

public class Result : EntityObject, IDataObject ....

public class ResultDataManager : BaseDataManager<Result> ...

IDataManager<T>のインスタンスを返すサービスロケーターを実装したいT

しかし、私は多くのキャストなしでそれをきちんと実装する方法に固執しました。

何か案は?

更新:以前のサービスロケーターでそれらを登録するためのタイプを検出するために、次のコードを使用していました:

 foreach (Type type in Assembly.GetExecutingAssembly().GetTypes())
            {
                if (type.GetInterface("ISQLDataAccessManager") != null && !type.IsAbstract)
                {
                    var manager = (ISQLDataAccessManager)Activator.CreateInstance(type);

                    _managers.Add(type, manager);

                    var typeDO = manager.GetDataObjectType();

                    _typeNames2Types.Add(typeDO.FullName, typeDO);
                    _managers2BO.Add(typeDO, manager);
                }
            }

ジェネリックでのリフレクションがよくわからないようです

4

1 に答える 1

3

ロケーターをシングルトンとして使用しても問題ない場合の適切な解決策は次のとおりです。

static class Locator
{
    private static class LocatorEntry<T> where T : ...
    {
        public static IDataManager<T> instance;
    }

    public static void Register<T>(IDataManager<T> instance) where T : ...
    {
        LocatorEntry<T>.instance = instance;
    }

    public static IDataManager<T> GetInstance<T>() where T : ...
    {
        return LocatorEntry<T>.instance;
    }
}

ロケーターをシングルトンとして実装できない場合、 Dictionary<Type,object> を作成していくつかのキャストを行う方法はないと思います。

class Locator
{
    private readonly Dictionary<Type, object> instances;

    public Locator
    {
        this.instances = new Dictionary<Type, object>();
    }

    public void Register<T>(IDataManager<T> instance) where T : ...
    {
        this.instances[typeof(T)] = instance;
    }

    public IDataManager<T> GetInstance<T>() where T : ...
    {
        return (IDataManager<T>)this.instances[typeof(T)];
    }
}
于 2010-04-16T21:05:24.033 に答える