-->

我可以使用Activator.CreateInstance与接口?(Can I use Activa

2019-06-24 17:37发布

我有一个例子:

        Assembly asm = Assembly.Load("ClassLibrary1");
        Type ob = asm.GetType("ClassLibrary1.UserControl1");
        UserControl uc = (UserControl)Activator.CreateInstance(ob);
        grd.Children.Add(uc);

还有我创建一个类的实例,但我怎么可以创建一个实现了一些接口的类的实例? 即实现的UserControl1接口I负荷

U:我可以投对象以后的界面,但我不知道是哪个类型的组件实现的接口。

Answer 1:

这是一些代码,我用过几次。 它发现在实现某个接口的组件的所有类型:

Type[] iLoadTypes = (from t in Assembly.Load("ClassLibrary1").GetExportedTypes()
                     where !t.IsInterface && !t.IsAbstract
                     where typeof(ILoad).IsAssignableFrom(t)
                     select t).ToArray();

然后,你必须在ClassLibrary1的实现所有类型的ILoad

然后,您可以实例化所有的人:

ILoad[] instantiatedTypes = 
    iLoadTypes.Select(t => (ILoad)Activator.CreateInstance(t)).ToArray();


Answer 2:

你不能创建一个接口的实例,但如果

实现的UserControl1 I负荷inteface

你可以使用结果对象作为ILoad

ILoad uc = (ILoad)Activator.CreateInstance(ob);
grd.Children.Add(uc);

此外,你不需要通过接口来对待它,如果你写

UserControl1 uc = (UserControl1)Activator.CreateInstance(ob);
grd.Children.Add(uc);

的成员ILoad将是可调用作为uc.SomeILoadMethod();



Answer 3:

你想要什么可以使用像`NInject”一个IoC容器来实现。 您可以配置一个容器返回一个具体类型,当你所要求的接口。



Answer 4:

接口是一个接口。 这是一个模板。 你为什么要实例化的界面? 实现接口和实例化类。 你不能实例化一个接口,它并没有真正意义。



Answer 5:

与接受的答案唯一的问题是,你必须对你的组件实现该接口的具体类。

为了避免这种情况我已经创建了我的CustomActivator就是能够在运行时创建一个动态物体,并使其实现所需的接口。

我把它放在github上: https://github.com/fabriciorissetto/CustomActivator

电话是简单的:

CustomActivator.CreateInstance<MyInterface>();


Answer 6:

如果库项目中所引用您可以使用:

    static public IEnumerable<Type> GetTypesFromLibrary<T>(String library)
    {
        var MyAsemblies = AppDomain.CurrentDomain.GetAssemblies()
                         .Where(a=>a.GetName().Name.Equals(library))
                         .Select(a=>a);
        var Exported = MyAsemblies
                         .FirstOrDefault()
                         .GetExportedTypes();
        var Asignable = Exported
                         .Where (t=> !t.IsInterface && !t.IsAbstract
                         && typeof(T).IsAssignableFrom(t))
                         .Select(t=>t)
                         .AsEnumerable();
        return Asignable;
    }

    static public T GetInstanceOf<T>(String library, String FullClassName)
    {
        Type Type = GetTypesFromLibrary<T>(library)
                        .Where(t => t.FullName.Equals(FullClassName))
                        .FirstOrDefault();
        if (Type != null)
        {
            T Instance = (T)Activator.CreateInstance(Type);
            return Instance;
        }
        return default(T);
    }


文章来源: Can I use Activator.CreateInstance with an Interface?