2014-03-19 3 views
11

.NET 4.5 (2012)부터 일부 새로운 확장 방법이 표시됩니다 (System.Reflection.RuntimeReflectionExtensions class). 그러나 새로운 방법은 우리에게 새로운 것을주지 않는 것 같습니다. 예 :System.Reflection.RuntimeReflectionExtensions에있는 메서드의 용도는 무엇입니까?

static void Main() 
{ 
    var prop1 = typeof(string).GetProperty("Length"); 
    var prop2 = typeof(string).GetRuntimeProperty("Length"); // extension, needs: using System.Reflection; 
    Console.WriteLine(prop1 == prop2); 

    Action a = Main; 
    var meth1 = a.Method; 
    var meth2 = a.GetMethodInfo(); // extension, needs: using System.Reflection; 
    Console.WriteLine(meth1 == meth2); 
} 

이것은 True을 두 번 씁니다.

(여기에는 == 연산자가 오버로드되어 있지만 참조 동등성을 (object)prop1 == (object)prop2(object)meth1 == (object)meth2으로 지정하면 True이됩니다).

그럼 공개적으로 볼 수있는 새로운 방법의 목적은 무엇입니까? 분명히 나는 ​​뭔가를 간과하거나 오해해야합니다.

+0

또한 내부적으로'GetRuntimeProperty'가 동일한'type.GetProperty (name) '메소드를 실행하기 때문에이 메소드가 존재하는 이유를 모르겠습니다. –

+0

목적이 없습니다. 그것은 완전히 중복됩니다. 디 컴파일 된 코드를 보면, 그 코드가 얼마나 무의미한 지 알 수 있습니다. 코드베이스에 들어간 누군가가 잠 들어 있었다고 생각해보십시오. – leppie

+1

이것은 WinRT를 지원하기 위해 추가해야했습니다. 어떤 기반으로 COM, 그것은 반사를 지원하지 않습니다. 기본 유형 시스템을 숨기려면 CLR에 내장 된 언어 프로젝션에 숨어있는 많은 단점이 있습니다. 매우 미묘한 것은 없지만 문자열은 WinRT의 * 매우 다른 유형입니다. 그러나 완벽하지는 않습니다. 정확히 어떻게 에뮬레이션하는지 모릅니다. –

답변

1

GetRuntime * 메서드는 WinRT 프로젝트에 사용됩니다. WinRT에서 사용하는 형식은 .NET에서 사용하는 형식과 다를 수 있지만 여전히 동일하게 작동하고 같은 이름을 사용하기 때문에 이러한 리플렉션 메서드는 올바른 MemberInfo가 반환되는지 확인합니다. WinRT를 실행하는 경우 런타임시 .NET MemberInfo가 필요하지는 않습니다.

원본 질문에 대한 Hans Passant의 의견을 참조하십시오.

+2

이러한 확장 방법은 어떻게 유용할까요? 누가이 확장 메소드를 사용할 것이며, 누가 System.Type에 "old"인스턴스 멤버를 사용할 것인가? WinRT가 타입 시스템 때문에 특별한 동작을 필요로한다면, 왜 그것은 단지 Type.GetProperties (BindingFlags) 추상 메소드의 특별한 오버라이드를 제공하지 않는가? 가상 구성원이 아닌 다른 구성원도 원하는대로 구현할 수 있습니다. 간추려서, 나는 그 확장이 얼마나 유용한 지 알 수 없다. 하향 투표. –

+2

"버전 정보"의 ['System.Type' 설명서] (http://msdn.microsoft.com/en-us/library/system.type.aspx)를 보면 * .NET 용 Windows 스토어 앱 *. ['GetPropertyImpl'] (http://msdn.microsoft.com/en-us/library/system.type.getpropertyimpl.aspx) 또는 ['GetProperties (BindingFlags)'] (http : //msdn.microsoft.com/en-us/library/kyaxdd3x.aspx), 그들은 Windows * 앱 스토어에서 * .NET에 없습니다. 그렇다면 'System.Type'에 확장 기능을 만드는 대신 필요로하는 인스턴스 메소드를 포함시키는 것이 어떨까요? –

+0

이전 버전과의 호환성을 보장하는 것은 엄격한 규칙 일 수 있습니다. 여기에는 두 가지 가능한 충돌이 있습니다. 1) Type에 대한 자체 GetRuntimeField 확장 메소드가있는 코드, 2) Type을 반영하고 멤버 주문에 의존하는 코드. –

관련 문제