2010-11-22 6 views
29

죄송합니다. 문서에서 System.Type 유형과 PropertyInfo 유형을 찾고 있는데 필요한 항목을 찾을 수 없습니다.속성이 가상으로 선언되었는지 알아보십시오

속성 (또는 메서드 또는 다른 멤버)이 선언 클래스에 virtual으로 선언되었는지 어떻게 알 수 있습니까?

예 : Age 속성이 virtual 여부를 선언하는 경우

class Cat 
{ 
    public string Name { get; set; } 
    public virtual int Age { get; set; } 
} 

어떻게 알 수 있습니까? - 자신의 접근이

var isVirtual = typeof(Cat).GetProperty("Age").GetGetMethod().IsVirtual; 

답변

49

당신은 IsVirtual 속성을 사용할 수 있습니다. 이 시도 : 당신이 원하는 경우

typeof(Cat).GetProperty("Age").GetAccessors()[0].IsVirtual 

, 당신 같은 확장 방법을 사용할 수있는 속성이 가상인지 확인하려면 다음

public static bool? IsVirtual(this PropertyInfo self) 
{ 
    if (self == null) 
     throw new ArgumentNullException("self"); 

    bool? found = null; 

    foreach (MethodInfo method in self.GetAccessors()) { 
     if (found.HasValue) { 
      if (found.Value != method.IsVirtual) 
       return null; 
     } else { 
      found = method.IsVirtual; 
     } 
    } 

    return found; 
} 

null을 반환하거나 속성이 더 접근이없는 경우 (전혀 발생하지 않아야 함) 또는 모든 속성 접근자가 동일한 가상 상태를 가지지 않습니다. 적어도 하나는 가상 상태이고 하나는 가상 상태가 아닙니다.

+1

고려중인 속성이 쓰기 전용 인 경우 실패합니다. – cdhowie

+0

답변에 많은 감사드립니다. –

+1

@cdhowie 예, 실패합니다. 나는 나의 예에서 오류 검사를 포함하지 않았다. –

17

는 기술적으로, 속성이 아닌 가상 있습니다

+1

+1'GetAccessors()'가 더 낫습니다. –

+0

문제를 해결하기 위해 ** LINQ **를 사용했습니다 :'var isVirtual = prop.GetType(). GetProperties() .Xhere> x.GetAccessors(). Any (a => a.IsVirtual)); ' –

+0

@MichaelCeranski 접근자가 가상 ​​속성을 상충하는 경우에도 내 코드와 동일한 기능을 수행하지 않습니다. – cdhowie

관련 문제