Kann ich Activator.CreateInstance mit einer Schnittstelle verwenden?

9

Ich habe ein Beispiel:

%Vor%

Dort erstelle ich eine Instanz einer Klasse, aber wie kann ich eine Instanz einer Klasse erstellen, die eine Schnittstelle implementiert? d. h., UserControl1 implementiert die ILoad -Schnittstelle.

U: Ich kann das Objekt später in die Schnittstelle umwandeln, aber ich weiß nicht, welcher Typ in den Assemblies die Schnittstelle implementiert.

    
Arman Hayots 24.05.2012, 07:22
quelle

6 Antworten

16

Dies ist ein Code, den ich ein paar Mal benutzt habe. Es findet alle Typen in einer Assembly, die eine bestimmte Schnittstelle implementieren:

%Vor%

Dann haben Sie alle Typen in ClassLibrary1, die ILoad implementieren.

Sie könnten dann alle von ihnen instanziieren:

%Vor%     
Botz3000 24.05.2012, 07:32
quelle
4

Sie können keine Instanz einer Schnittstelle erstellen, aber wenn

  

UserControl1 implementiert ILoad-Schnittstelle

Sie können das resultierende Objekt als ILoad

verwenden %Vor%

Außerdem müssen Sie es nicht über die Schnittstelle behandeln, wenn Sie

schreiben %Vor%

Mitglieder von ILoad könnten als uc.SomeILoadMethod();

aufgerufen werden     
archil 24.05.2012 07:25
quelle
4

Was Sie wollen, können Sie mit einem IoC-Container wie 'NInject' erreichen. Sie können einen Container so konfigurieren, dass er einen konkreten Typ zurückgibt, wenn Sie eine Schnittstelle angefordert haben.

    
Aphelion 24.05.2012 07:28
quelle
3

Interface ist eine Schnittstelle. Es ist eine Vorlage. Warum möchten Sie eine Schnittstelle instanziieren? Implementieren Sie die Schnittstelle und instanziieren Sie diese Klasse. Sie können eine Schnittstelle nicht instanziieren, das macht keinen Sinn.

    
walther 24.05.2012 07:26
quelle
3

Das einzige Problem mit der akzeptierten Antwort ist, dass Sie eine konkrete Klasse in Ihrer Assembly haben müssen, die die Schnittstelle implementiert.

Um zu vermeiden, dass ich meinen CustomActivator erstellt habe, der in der Lage ist, zur Laufzeit ein dynamisches Objekt zu erstellen, das die gewünschte Schnittstelle implementiert.

Ich lege es auf den GitHub: Ссылка

Der Anruf ist einfach:

%Vor%     
fabriciorissetto 17.05.2015 03:06
quelle
2

Wenn die Bibliothek im Projekt referenziert wurde, können Sie Folgendes verwenden:

%Vor%     
user55993 12.07.2014 04:42
quelle