2012-11-01 5 views
2

구체 매개 변수가 지정되지 않은 채로 누군가가 C# 언어 인 typeof(SomeGenericType<>에 대한 필요성을 설명 할 수 있습니까?(개방형 제네릭 유형) 매개 변수가 지정되지 않은 typeof 제네릭 형식

나는 다음과 같은 예를 함께 넣어 : 내가 처음 typeof(Nullable<>) 제네릭 매개 변수 int를 지정 t2보다 "더 일반적인"입니다 생각

 var t1 = typeof(Nullable<>); 
     var t2 = typeof(Nullable<int>); 
     var q = 1 as int?; 

     var b1 = t1.IsInstanceOfType(q); //false 
     var b2 = t2.IsInstanceOfType(q); //true 

,하지만 b1false 것으로 밝혀졌습니다 - 그래서 int?의 인스턴스가 아닌 예 : Nullable<>.

b1에 대해 변수를 정의하는 방법은 true입니까? 어떤 실제적인 용도로 사용합니까?

+1

"X가 Y보다 일반"은 "Y가 X의 인스턴스"와 동의어가 아닙니다. –

답변

4

그래서 b1이 참이되도록 변수를 정의해야합니까?

수 없습니다. (실제로는 Nullable<T>과 함께 흥미로운 복싱 문제가 발생합니다.하지만 거기에 ...)

실행시 값은 항상 닫음 유형의 인스턴스입니다. Nullable<>, List<>열기 제네릭 종류입니다. 그런 유형의 IsInstanceOfType에 전화하는 것은 결코 유용하지 않습니다. 그렇다고해서 쓸모가 없다는 의미는 아닙니다.

일반적으로 열린 유형이 리플렉션에 사용됩니다. 예를 들어 : - 다시 스택까지 갈 수 적절한 위해 IEnumerable<T>에 캐스트 할 목록을

public IList CreateList(Type elementType) 
{ 
    Type closedType = typeof(List<>).MakeGenericType(elementType); 
    return (IList) Activator.CreateInstance(closedType); 
} 

일반적이지만, 대신 Type 값을 전달 낮은 수준으로 호출 고있는 최대 코드가있을 수 있습니다 T 값 특정 유형 일부에 대한 일반적인 인터페이스를 구현하는지 여부를

마찬가지로 당신은 등, 그것에 메서드를 호출하는 반사와 밀폐형를 만드는 당신은 또한를 확인하는 데 사용할 수 있습니다

을 할 수 있습니다 형식 인수 - 구현 된 각 인터페이스에 대해 일반 형식인지 알아 내고 제네릭 형식 정의를 가져와 IEnumerable<>과 같은지 여부를 확인할 수 있습니다.

4

오픈 제네릭 유형입니다.
실제 유형이 아닙니다. 그 유형의 인스턴스를 가질 수는 없습니다.

대신 콘크리트 (마감) 일반 유형 (예 : Nullable<int>)을 생성하는 데 사용할 수 있습니다.

GetGenericTypeDefinition() 메서드를 확인하여 닫힌 제네릭 유형이 특정 개방형 제네릭 유형의 인스턴스인지 여부를 확인할 수도 있습니다.

+0

당신은'open generic type'의 실용적인 예제를 제공 할 수 있습니까 –

+0

@glaucus : 정확히 무엇이 실제적인 예입니까? 'typeof (List <>)'는 오픈 제네릭 타입의 예입니다. – SLaks

관련 문제