2010-03-02 7 views
5

리플렉션을 사용하여 주어진 클래스의 속성에 ReadOnly 특성이 설정되어 있는지 확인하려고합니다. 내가 사용하고 클래스는 메타 데이터에 대한 부분 "친구"클래스를 사용하여 (MVC보기 모델이다.C# 버디 클래스/메타 데이터 및 리플렉션

public partial class AccountViewModel 
{ 
    public virtual Int32 ID { get; set; } 
    public virtual decimal Balance { get; set; }  

} 
[MetadataType(typeof(AccountViewModelMetaData))] 
public partial class AccountViewModel 
{ 
    class AccountViewModelMetaData 
    { 
     [DisplayName("ID")] 
     public virtual Int32 ID { get; set; } 

     [DisplayName("Balance")] 
     [DataType(DataType.Currency)] 
     [ReadOnly(true)] 
     public virtual decimal Balance { get; set; } 

    } 
} 

I는 "균형"이 읽기 전용 속성이 있는지 확인하고 싶다. 내가 밸런스에 읽기 전용 속성을 설정하는 경우 AccountViewModel의 속성은, 내가 그것을 이런 식으로 검색 할 수 있습니다.?이 메타 데이터 클래스에있는 경우

Type t = typeof(AccountViewModel); 
PropertyInfo pi = t.GetProperty("Balance"); 
bool isReadOnly = ReadOnlyAttribute.IsDefined(pi,typeof(ReadOnlyAttribute); 

내가 속성 정보를 검색 할 수 없습니다를 내가 속성이 존재하는지 확인할 수 있습니다 어떻게 메타 데이터 클래스를 정의 내 모든 뷰 모델에 대해 메타 데이터 클래스의 특성을 확인하는 일반적인 방법이 필요합니다.

제안 사항이 있으십니까?

답변

1

짧지 만 작동하는 예제는 다음과 같습니다. 중첩 된 클래스를 외부에서 볼 수 있도록 internal으로 만들었습니다.

public partial class AccountViewModel 
{ 
    internal class AccountViewModelMetaData 
    { 
     public virtual Int32 ID { get; set; } 
     [ReadOnlyAttribute(false)] 
     public virtual decimal Balance { get; set; } 
    } 

    public virtual Int32 ID { get; set; } 
    public virtual decimal Balance { get; set; } 
} 
class Program 
{ 
    public static void Main(string[] args) 
    { 
     Type metaClass = typeof(AccountViewModel.AccountViewModelMetaData); 

     bool hasReadOnlyAtt = HasReadOnlyAttribute(metaClass, "Balance"); 

     Console.WriteLine(hasReadOnlyAtt); 
    } 

    private static bool HasReadOnlyAttribute(Type type, string property) 
    { 
     PropertyInfo pi = type.GetProperty(property); 

     return ReadOnlyAttribute.IsDefined(pi, typeof(ReadOnlyAttribute)); 
    } 
} 

또한 속성의 존재 여부를 확인해야합니다. 이 예에서는 속성을 지정하지만 false 값을 제공 할 수 있습니다. 속성이 읽기 전용인지 확인하려면 ReadOnlyAttribute.IsDefined 메서드를 사용할 수 없습니다.

7

솔루션은이 정의되어 있는지

Type t = typeof(MyClass); 
PropertyInfo pi = t.GetProperty(PropertyName); 
bool isReadOnly = ReadOnlyAttribute.IsDefined(pi, typeof(ReadOnlyAttribute)); 

if (!isReadOnly) 
{ 
    //check for meta data class. 
    MetadataTypeAttribute[] metaAttr = (MetadataTypeAttribute[])t.GetCustomAttributes(typeof(MetadataTypeAttribute),true); 

    if (metaAttr.Length > 0) 
    { 
     foreach (MetadataTypeAttribute attr in metaAttr) 
     { 
      t = attr.MetadataClassType; 
      pi = t.GetProperty(PropertyName); 

      if (pi != null) isReadOnly = ReadOnlyAttribute.IsDefined(pi, typeof(ReadOnlyAttribute)); 

      if (isReadOnly) break; 
     } 
    } 
} 
+1

당신이 속성이 존재 함을 확인하고 있음을 조심하지 ... 메타 데이터 유형을 얻을 수 GetCustomAttributes를 사용뿐만 아니라 이들의 속성을 확인하는'진정한했다입니다 '. 속성이 정의 된 경우'[ReadOnlyAttribute (false)]'가 있으면 어떻게 될지 고려 했습니까? –

+1

죄송 합니다만 귀하의 솔루션을 이해하지 못했습니다. :( – Rohit