2011-02-02 1 views
2

내 응용 프로그램이 실행되는 CLR에 따라 두 가지 다른 동작이 나타납니다. 어떤 경우에는 닫힌 형식의 추상 속성을 반환하고 그렇지 않은 경우에는 추상 속성을 반환합니다. 속성은 추상적이므로 첫 번째가 옳은 것처럼 느껴집니다.GetMember는 닫힌 형식의 추상 속성을 반환해야합니까?

나는 다른 CLR 부 버전과 다른 시스템에 대한 물리적 실행 파일을 복사 한 후 .NET 3.5 SP1을 타겟팅 VS2010에서 다음을 컴파일 및 테스트 한 :

public abstract class BaseEntity<TId> 
{ 
    public abstract TId PK { get; set; } 
} 

public class DerivedEntity : BaseEntity<int> 
{ 
    public override int PK { get; set; } 
} 

class Program 
{ 
    static void Main(string[] args) 
    { 
     var derivedEntity = new DerivedEntity(); 
     var type = derivedEntity.GetType(); 
     var flags = BindingFlags.Public | BindingFlags.Instance | BindingFlags.SetProperty; 
     foreach (var memberInfo in type.GetMember("PK", flags)) 
     { 
      Console.WriteLine(
       "Member: " + memberInfo.Name 
       + " from " + memberInfo.DeclaringType); 
     } 

     Console.WriteLine("Running : " + Environment.Version); 
     Console.WriteLine("mscorlib: " + typeof(int).Assembly.GetName().Version); 
    } 
} 

을 2.0.50727.4952 I를 실행하는 시스템에 내가 할 다른 출력

Member: PK from MemberInfoTest.DerivedEntity 
Running : 2.0.50727.4952 
mscorlib: 2.0.0.0 

2.0.50727.3615를 실행하는 시스템에서 :

Member: PK from MemberInfoTest.DerivedEntity 
Member: PK from MemberInfoTest.BaseEntity`1[System.Int32] 
Running : 2.0.50727.3615 
mscorlib: 2.0.0.0 
,536,913을 다음과 같은 출력을 볼

위의 차이로 인해 다양한 상황에서 AmbiguousMatchException이 발생합니다. 다음 중 올바른 행동과 다른 행동에 대한 "수정"이 있습니까?

EDIT : 방금 ​​CLR-4 런타임을 대상으로 테스트를했는데 두 경우 모두 추상 닫힌 속성이 반환되지 않았으므로 첫 번째 동작이 올바른 것으로 나타났습니다.

+0

답변이 없지만이 링크가 도움이 될 수 있습니다. http://stackoverflow.com/questions/212896/how-do-the-net-framework-clr-and-visual-studio-version-numbers-relate-to-each-o – airmanx86

+0

당신은 정말로 abstract * property * ('PK')가 아니라 method *에 관한 것이지? – stakx

+0

@stakx 당신 말이 맞습니다. –

답변

3

이 문제가 발생하는 이유는 확실하지 않습니다. 내 생각 엔 RTM과 SP1 CLR과 반사가 2 가지 버전 사이의 미묘한 차이점/버그를 겪고 있다는 것입니다.

BindingFlags.DeclaredOnly을 설정하여 GetMembers을 실행중인 특정 유형에 대해 선언 된 PK 구성원을 나타내도록하면이 문제를 해결할 수 있습니다. DeclaredOnly은 반환 유형을 특정 유형에 대해 선언 된 멤버로만 제한합니다. 상위 유형에 선언 된 멤버를 필터링합니다.

+0

+1 근본 원인에 대한 의문을 살펴보십시오. 'DeclaredOnly'는 진정한 상속 계층 때문에 항상 효과가있는 것은 아닙니다. 정확한 동작을 파악하여 응용 프로그램을 패치할지 또는 가능한 경우 기분을 상하게하는 시스템을 업데이트 할지를 알고 싶습니다. –

관련 문제