2017-11-22 3 views

Antwort

1

elegante ist nur zu subjektiv, so dass ich hoffe, dass meine Lösung Ihr Konzept von Eleganz passt =)

Sie ReflectionModelServices Klasse verwenden können, die bei System.ComponentModel.Composition.ReflectionModel ist. Wie der Name schon sagt, verwendet es Reflection intern, aber gut, ist Teil von MEF und MEF verwendet Reflektion.

Wenn Sie ohne Reflexion sagten, nehme ich an, Sie beziehen sich auf die Verwendung von Reflexion direkt auf den Typ. Also lasst uns weitermachen ...

Lassen Sie sagen, wir haben die folgenden:

internal interface IFoo { } 

internal class Boo : IFoo 
{ 
    [Import] public string SomeString; 

    [ImportingConstructor] 
    public Boo(int someInt) { } 
} 

internal class Moo : IFoo 
{ 
    [Import] public float SomeFloat; 
} 

Dann, wo Sie Ihre Kataloge erstellen (für mich in Haupt einer Konsolenanwendung sein passiert) Sie iterieren Ihr Katalog der Teile und kontrollieren jedes Importdefinitionen der Teil:

private static void Main(string[] args) 
{ 
    var regBuilder = new RegistrationBuilder(); 
    regBuilder.ForTypesMatching(t => typeof(IFoo).IsAssignableFrom(t)) 
     .Export<IFoo>(); 
    var catalog = new AssemblyCatalog(Assembly.GetExecutingAssembly(), regBuilder); 

    foreach (var composablePartDefinition in catalog.Parts) 
     if (typeof(IFoo).IsAssignableFrom(ReflectionModelServices.GetPartType(composablePartDefinition).Value)) 
      foreach (var importDefinition in composablePartDefinition.ImportDefinitions) 
       Console.WriteLine(
        $"Contract name: {importDefinition.ContractName}. Is parameter (for ImportingConstructor stuff): {ReflectionModelServices.IsImportingParameter(importDefinition)}"); 
    Console.ReadLine(); 
} 

Der Ausgang hierfür ist:

enter image description here

können Sie versuchen, andere Eigenschaften zu erforschen, die ImportDefinition definieren, zum Beispiel wissen, dass Sie kann die Mächtigkeit oder den Anteil Politik, die beide von ihnen sind dort ... =)

Hoffnung, das hilft.

+0

Es ist, was ich brauchte, es ist kurz, es ist schnell (Reflection muss nicht zweimal ausgeführt werden, wie MEF es schon getan hat), es ist informativ - es ist elegant! :) –

Verwandte Themen