18

私は例を持っています:

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

クラスのインスタンスを作成していますが、何らかのインターフェイスを実装するクラスのインスタンスを作成するにはどうすればよいですか?つまり、 UserControl1はILoadインターフェイスを実装します。

U:後でインターフェイスにオブジェクトをキャストできますが、アセンブリのどのタイプがインターフェイスを実装しているかわかりません。

4

6 に答える 6

24

これは私が数回使用したコードです。特定のインターフェイスを実装するアセンブリ内のすべてのタイプを検索します。

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();
于 2012-05-24T07:32:57.563 に答える
6

受け入れられた答えの唯一の問題は、インターフェイスを実装するアセンブリに具象クラスが必要なことです。

これを回避するために、実行時に動的オブジェクトを作成し、目的のインターフェイスを実装できるCustomActivatorを作成しました。

私はそれをgithubに置きました: https ://github.com/fabriciorissetto/CustomActivator

呼び出しは簡単です:

CustomActivator.CreateInstance<MyInterface>();
于 2015-05-17T03:06:34.560 に答える
5

インターフェイスのインスタンスを作成することはできませんが、

UserControl1はILoadインターフェイスを実装します

結果のオブジェクトを次のように使用できますILoad

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

さらに、あなたが書くならば、あなたはそれをインターフェースを介して扱う必要はありません

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

のメンバーは次のILoadように呼び出すことができますuc.SomeILoadMethod();

于 2012-05-24T07:25:17.433 に答える
4

`NInject'のようなIoCコンテナを使用して、必要なことを実現できます。インターフェイスを要求したときに具象型を返すようにコンテナを設定できます。

于 2012-05-24T07:28:41.660 に答える
3

インターフェイスはインターフェイスです。テンプレートです。なぜインターフェースをインスタンス化したいのですか?インターフェイスを実装し、そのクラスをインスタンス化します。インターフェイスをインスタンス化することはできません。実際には意味がありません。

于 2012-05-24T07:26:45.063 に答える
2

ライブラリがプロジェクトで参照されている場合は、次を使用できます。

    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);
    }
于 2014-07-12T04:42:28.303 に答える