Interfaces in Assemblies



  • Hallo,
    Ich möchte mittens Assembly.CreateInstance ein interface erstellen.
    Dafür möchte ich aber vorher schaun, ob das interface überhaupt im Typen implementiert ist, aber es wird anscheinend nicht von basetype angegeben.
    Wie bekomme ich das raus?



  • Ich hab das so implementiert. Hier schau ich nach ob jeder type in der assembly von einem z.b. IBasicInterface abgeleitet wurde.

    bool basicInterfaceFound = false;
    				AssemblyInfo^ ainfo = gcnew AssemblyInfo();
    				ainfo->AssemblyObject = asb;
    				array<System::Type^>^ typArray = asb->GetTypes();
    				for each(System::Type^ rootItem in typArray)
    				{
    					array<System::Type^>^ infs = rootItem->GetInterfaces();
    					for each(System::Type^ item in infs)
    					{ 
    						if(item == IBasicInterface::typeid && item->IsInterface)
    						{
    							ainfo->AddTypeMap(rootItem->ToString(), rootItem);
    							basicInterfaceFound = true;
    							break;
    						}
    					}
    				}
    


  • Ich hab ja ne ähnliche Methode, aber irgendwie werden bei mir nur die Klasse und dann Object angezeigt, das Interface das drinne is is garnich dabei.



  • Strange.

    Álso ich hab mal deinen case nachgestellt.

    Main:

    Assembly^ asb = Assembly::Load("iface");
    	array<System::Type^>^ typArray =asb->GetExportedTypes();
    	for each(System::Type^ rootItem in typArray) 
    	{ 
    		Console::WriteLine("Type: {0}", rootItem->Name);
    	}
    

    class lib:

    namespace iface {
    
    	public interface class ITestInterface
    	{
    		void Print();
    	};
    

    Output:

    Type: ITestInterface



  • Ja ich lad ne Assenbly mit Assembly::LoadFrom ( filename )
    Kuck dann rekursiv ( type = type->basetype , if type != 0 ) die Basistypen durch

    Außerdem mit

    interface class IIrgendwas { ... } ;
    ref class Lala : IIrgendwas { ... };
    und nicht nur mit interface Klassen
    


  • Der Load Context sollte hier keine Rolle spielen.

    Der Base Type reduziert sich meist immer auf System::Object.
    Nachdem du ja in CLI noch immer multiple inheritance haben kannst (stark eingeschränk eben auf ein interface und eine implementation), wird bei interface ableitungen einer klasse ohne eine implementationn, ein System::Object implizit abgeleitet. Um das zu unterscheiden gibt es eben GetInterface().

    Der BaseType eines interfaces ist, da es ja ein abstraktes Konstrukt ist, gar nix.

    Also um wirklich zu wissen was das vererbende und abstrakte "Entität" einer Klasse ist, musst du sowohl GetInterface also auch BaseType abfragen.


Anmelden zum Antworten