2010-03-02 32 views
5

Belirli bir sınıftaki özelliklerin bir ReadOnly öznitelik kümesi olup olmadığını kontrol etmek için yansıma kullanmaya çalışıyorum. Ben kullanıyorum sınıfları meta veriler için kısmi "dostum" sınıfını kullanarak (MVC Görünüm Modelleri bulunmaktadır.C# Buddy Sınıfları/Meta Verileri ve Yansıma

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; } 

    } 
} 

ben "Denge" ReadOnly özelliğinin olup olmadığını kontrol etmek istiyorum. Ben Dengesi ReadOnly özniteliği ayarlarsanız AccountViewModel malı, ben bunu şu şekilde alabilirsiniz.? o meta veri sınıfına ise

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

Ben nitelik bilgisi alamıyor i nitelik varsa kontrol edebilirsiniz nasıl meta veri sınıfları tanımladıktan tüm görünüm modellerim için ve meta veri sınıflarındaki öznitelikleri kontrol etmek için genel bir yönteme ihtiyaç duyarsınız.

Herhangi bir öneriniz var mı?

cevap

1

Kısa ama işleyen bir örnek, dışarıdan görünebilmek için iç içe geçmiş sınıfı internal yaptığımı unutmayın. Ayrıca, özniteliğin varlığını kontrol ettiğini de unutmayın. Bu örnekte özniteliği belirtebilir ancak false değerini sağlayabilirsiniz. Özelliğin salt okunur olup olmadığını kontrol etmek isterseniz, yalnızca ReadOnlyAttribute.IsDefined yöntemini kullanamazsınız.

7

çözüm tanımlandığını

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

özelliğinizde bulunup bulunmadığını kontrol ediyoruz sakının ve ... MetaData türlerini almak için GetCustomAttributes kullanmak ve bunları da özelliklerini denetlemek için 'gerçek olmasıdır '. Özellik tanımlanmışsa ne olacağını düşündünüz mü? [ReadOnlyAttribute (false)] '? –

+1

Üzgünüm ama çözümünüzü anlayamadım. :( – Rohit