2011-11-09 2 views
2

오픈 제네릭 형식에 대해 vaiable을 선언 할 수있는 방법이 있습니까?오픈 제네릭 형식에 대한 변수를 선언하는 방법은 무엇입니까? 가능한?

Given : 사용자가 팩토리 메소드에서 가져 오는 일반 클래스 로거가 있습니다. 어떤 로거를 담을 수있는 변수가있는 방법이 있습니까?

지금 로거는 로거에서 상속되며 어떤 유형의 데이터도 신경 쓰지 않고 인스턴스에 대한 변수를 선언 할 수 있습니다.

저는 MEF를 사용하며 [내보내기 (typeof (Logger <>)]와 같은 구문을 사용하여 제네릭 형식을 내보낼 수 있습니다. (가져 오기시 정확한 유형 지정) 일부 지원이 있습니다. 오픈 타입 (최소한 typeof). 내가 지금 필요한 것은

로거 < 로거 {get; 세트; }

그런 일을 할 가능성이 있습니까? 이 특정 구문을 통해 "유형 필요"가 표시됩니다.

+0

왜 '객체'를 사용하지 않습니까? –

+0

@Lasse : myObject.Log (something)가 컴파일 오류를 생성하기 때문에 (변수가 * 참조 만 저장하는 데 사용되지 않았 음). 'dynamic'은 옵션이 될 것이지만 컴파일 타임 구문 검사를 잃을 것입니다. – Heinzi

+0

그게 정확히입니다. Logger에 대해 X (config) 유형의 로깅 서비스를 요청하지만 특정 genric 유형에 로깅하는 데 관심이 없습니다. 모든 내용은 기본 부분입니다. 때로는 로거 (하위 클래스 등)를 전달할 수 있으며 알 필요가 없습니다. 나는 (여기와 다른 시나리오에서) 기본 클래스를 갖는 것을 피하려고한다. – TomTom

답변

2

이가 out modifier로 선언 된 경우 로거의 형식 매개 변수, 즉, covariant 경우, 당신은 Logger<object>를 사용할 수 있습니다.

IEnumerable<object> = new List<string>; // this works, because IEnumerable is covariant 

로거의 형식 매개 변수는 공변되지 않은 경우, 즉, 당신이 어딘가에 입력 매개 변수로 사용하는 경우, 예를 들어, Log(T dataToLog), 그런 다음 공통 인터페이스를 구현하거나 공통 기본 클래스를 사용하는 것이 목표를 달성하는 유일한 방법 인 것 같습니다.

관련 문제