2017-11-22 11 views

답변

1

우아한은 너무 주관적이다, 그래서 나는

당신은 System.ComponentModel.Composition.ReflectionModel에 있습니다 ReflectionModelServices 클래스를 사용할 수 있습니다) = 내 솔루션은 우아함의 개념에 맞는 바랍니다. 이름에서 알 수 있듯이 Reflection을 내부적으로 사용하지만 잘, MEF의 일부이며 MEF는 리플렉션을 사용합니다.

리플렉션없이이라고 말하면 유형에 직접 반영을 사용한다고 가정합니다. 당신이 반복 다음

internal interface IFoo { } 

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

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

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

당신이 당신의 카탈로그를 만드는 곳 (나를 위해 콘솔 응용 프로그램의 홈페이지에 우연히) : 그래서,

하자 우리는 다음과 같은이 있다고 ... 계속 할 수 있습니다 카탈로그의 부품 검사 각 부분의 수입 정의 :

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(); 
} 

이의 출력은 다음과 같습니다

enter image description here

당신이 기수 또는 공유 정책을 알고 할 수 있습니다 예를 들어

당신은 둘 다 ... =)

희망이가 할 수있는, ImportDefinition을 정의하는 다른 속성을 탐구하는 시도 할 수 있습니다.

+0

내가 필요로하는 것은 짧고 빠르며 (MEF가 이미 그랬던 것처럼 Reflection을 두 번 실행할 필요가 없음) 유익한 정보입니다. :) –