2017-09-03 1 views
2

나는 모든 인터페이스가 IOperator<T1,T2>과 관련된 일반 인터페이스의 계층 구조를 사용합니다.일반 인터페이스의 인스턴스를 구현하는 모든 클래스의 인스턴스화

interface IOperator<T1, T2> 
{ 
    Func<T1, T2, bool> GetFunc() 
} 

IOperator : IOperator<object, object> 

interface IMatchingOperator : IOperator<string, string> { } 


interface IComparisonOperator<T1, T2> : IOperator<T1, T2> 
    where T1: IComparable<T2> { } 

interface IComparisonOperator<T> : IComparisonOperator<T, T> 
    where T: IComparable<T> { } 

interface IComparisonOperator : IComparisonOperator<IComparable, object> 

나는 예를 들어, 이러한 인터페이스 중 하나 이상을 구현하는 클래스 (일반되지 않음)을 많이 가지고 :

class GreaterThanOperator : 
    IComparisonOperator, 
    IComparisonOperator<decimal>, 
    IComparisonOperator<DateTime>, 
    IComparisonOperator<DateTime, string> 
{ ... } 

class EqualComparator: IOperator 

class RegexOperator : IMatchingOperator { ... } 

을 지금, 나는이로드 및 인스턴스화 할 수있는 공장을 만들려면 어셈블리의 모든 클래스는 부모 인터페이스 "IOperator"를 구현하고 컬렉션에 넣습니다.

나는 시도했다 :

AppDomain.CurrentDomain.GetAssemblies() 
       .SelectMany(x => x.GetTypes()) 
       .Where(
        x => x.IsGenericType 
        && x.GetGenericTypeDefinition() == typeof(IOperator<,>) 
        && !x.IsInterface && !x.IsAbstract)) 
       .Select(x => Activator.CreateInstance(x)).ToList(); 

그러나 그것은 작동하지 않습니다.

최종 목록에 각 IOperator 클래스의 인스턴스 하나를 보유하고 싶습니다. 다음 리플렉션을 사용하여 오브젝트를 탐색하여 사용하는 일반 유형을 확인합니다.

+0

첫 번째 질문 : 여기

당신이 선택을 수행 할 수있는 방법입니다. –

+0

이것은 팩토리의 정적 생성자에서 실행됩니다. 그 이유는 존재하는 모든 연산자를 알고 싶기 때문입니다. 게으른로드 방식을 구현하려면 어떻게해야합니까? – AFusco

+0

형식을 필요로 할 때 인스턴스화하고 원하는 경우 정적 속성에 캐싱 할 수도 있습니다. –

답변

2

Where 절은 generic 형식을 검사하지 않아야합니다. 즉, GreaterThanOperator 등의 클래스 자체가 generic 클래스가 아니기 때문입니다. 또한 IOperator<,>이 아니며 유형 정의입니다. 유형에 의해 구현되는 인터페이스 중 하나의 유형 정의입니다. 당신은`게으른 loading` 기술을 찾고있는 것 같습니다, 왜이 작업을 수행하려고하는,

var res = AppDomain.CurrentDomain.GetAssemblies() 
    .SelectMany(x => x.GetTypes()) 
    .Where(x => 
     !x.IsAbstract 
    && !x.IsInterface 
    && x.GetInterfaces().Any(i => 
      i.IsGenericType() 
     && i.GetGenericTypeDefinition() == typeof(IOperator<,>) 
     ) 
    ).Select(x => Activator.CreateInstance(x)).ToList(); 
관련 문제