IEnumerator<string>
유형의 매개 변수를 사용하는 루틴이있는 경우 클래스 유형 인스턴스에 대한 참조와 참조를 구별 할 수있는 방법이 있습니까 박스형 값 유형 인스턴스에? 내가 아는 사람이 같은 루틴이있는 경우 :리플렉션없이 박스형 값 유형을 참조 유형과 구별 할 수 있습니까
void DoSomething<T>(T param) where T:IEnumerator
이 T
는 값 형식하거나 Object.ReferenceEquals(param, param)
을 수행하여 반사를 사용하지 않고 참조 형식인지 여부를 알 수 있습니다. T
이 클래스 유형이면 항상 true를 반환하고 값 유형 인 경우 항상 false를 반환합니다 (인터페이스를 구현하기 때문에 nullable 값 유형 일 수 없음). 반대로, DoSomething<IEnumerator<string>>(myListOfStrings.GetEnumerator())
으로 전화를 걸려면 DoSomething
이 Reflection을 사용하지 않고 다른 유형의 상자와 구별 된 동작을 구분할 수는 없습니다. 박싱 된 값 유형의 동작이 클래스 유형의 동작과 다른 리플렉션과 관련없는 방식이 있습니까?
부록 내가 IFoo
를 구현하는 구조체 S1
이 가정 문제를 명확히하기 위해, 나는 클래스와 동일한 인터페이스를 구현하고, 정확하게 같은 메소드와 필드가 C1
있습니다. 변수에 선언 된 유형이 IFoo
인 경우 해당 변수에서 참조하는 박스형 S1
인스턴스의 '자연스러운'동작은 C1
의 인스턴스와 다르며 마찬가지로 을 참조하는 방식이 있습니까? 물론 다른 반품 Type
개체?
저는 개인적으로 typeof (T) .IsValueType과 관련된 것을 사용합니다. 어쩌면 정적 generic 클래스에서 결과를 캐시했을 수도 있습니다 ... –
왜 반사를 피하려고합니까? 또한 코드가 컴파일되지 않습니다. 'DoSomething> (myListOfStrings.GetEnumerator())'를 원하셨습니까? –
svick
@svick : IEnumeratable가 IEnumerator로 변경되었습니다. 감사. 조금 더 명확하게하기 위해 질문을 업데이트합니다. – supercat