代码之家  ›  专栏  ›  技术社区  ›  vittore

发现泛型类型

  •  0
  • vittore  · 技术社区  · 14 年前

    感谢@dtb的帮助,他建议真正需要一段通用服务定位器的代码

    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;
        }
    }
    

    但是在我以前的版本中,我使用了对程序集的反射来发现一百个数据管理器的

    我想写一个方法发现如下

    void Discover()
            {
                var pManager = new ProtocolSQLDataManager();
                Register(pManager);
    
                var rManager = new ResultSQLDataManager();
                Register(rManager);
    
                var gType = typeof(ISQLDataAccessManager<>);
    
                foreach (Type type in Assembly.GetExecutingAssembly().GetTypes())
                {               
                    if (type.IsSubclassOf(gType) && !type.IsAbstract))
                    {
                        var manager = Activator.CreateInstance(type);
                        // put something here in order to make next line of code works
                        Register<T>(manager);
                    }
                }
            }
    

    如何铸造 type 为了使寄存器正常工作(并调用适当的寄存器?

    更新:我想出来了

                foreach (Type type in Assembly.GetExecutingAssembly().GetTypes())
                {
                    if ( type.GetInterface("IDataAccessManager`1") != null && !type.IsAbstract)
                    {
                        var manager = Activator.CreateInstance(type);
                        var t = type.GetInterface("IDataAccessManager`1").GetGenericArguments()[0];
                        typeof(GenLocator)
                            .GetMethod("Register")
                            .MakeGenericMethod(t)
                            .Invoke(null, new[] { manager });
                    }
                }
    
    1 回复  |  直到 14 年前
        1
  •  3
  •   SLaks    14 年前

    你需要打电话 Register 使用反射,如下所示:

    typeof(Locator)
        .GetMethod("Register")
        .MakeGenericMethod(type)
        .Invoke(null, manager);