나는 모든 인터페이스가 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
클래스의 인스턴스 하나를 보유하고 싶습니다. 다음 리플렉션을 사용하여 오브젝트를 탐색하여 사용하는 일반 유형을 확인합니다.
첫 번째 질문 : 여기
당신이 선택을 수행 할 수있는 방법입니다. –
이것은 팩토리의 정적 생성자에서 실행됩니다. 그 이유는 존재하는 모든 연산자를 알고 싶기 때문입니다. 게으른로드 방식을 구현하려면 어떻게해야합니까? – AFusco
형식을 필요로 할 때 인스턴스화하고 원하는 경우 정적 속성에 캐싱 할 수도 있습니다. –