2009-01-19 13 views
16

.NET'te bir ortak özellik için bir öznitelik ayarlamak istiyorum, ancak başka bir dosyada oluşturulan kod olduğu için açık özelliğin kendisine erişimim yok.Koddaki özellik ile ilişkilendirilen öznitelik .net

public virtual string Name { get; set; } 

Bunu ayarlamak istediğiniz:

ben bu alanı var

[ValidateNonEmpty("Name is required", ExecutionOrder = 1)] 
public virtual string Name { get; set; } 

Benim sınıf kısmi olarak işaretlenmiş, ancak kısmi özelliklere sahip olamaz. Dinamik Veri ve DataAnnotation'ların yeni bir özelliği olan MetadataType sınıfı ile ilgili bir şey yaptığımı düşünmüştüm, ancak bunun sadece Dinamik Veri ile kullanılabileceğini hissettiğimi düşünüyorum, bu doğru mu?

Alıntılar: http://blogs.oosterkamp.nl/blogs/jowen/archive/2008/10/16/metadatatype-attribute.aspx http://blogs.msdn.com/davidebb/archive/2008/06/16/dynamic-data-and-the-associated-metadata-class.aspx

ben kod oluşturulan sınıf dokunmadan bu (hatta web.config üzerinden!) Niteliklerini ayarlayabilirsiniz herhangi bir yolu var mı? peşin

sayesinde Graham

cevap

22

Bu bilinen bir sıkıntı olduğu; Sadece oluşturulan üyelere meta veri ekleyemezsiniz.

(artan çaba sırayla) Burada 6 seçenek vardır:

  • sen niteliği sahipseniz, örneğin, sınıfa karşı beyan etmek mümkün kılar: [ValidateNonEmpty("Name", "Name is required", ExecutionOrder = 1)] - o zaman birden fazla özellikler eklemek kısmi sınıf tanımı
  • oluşturulan tür alt sınıfları yerine, bunu sorgulamak için bir sanal/arabirim/etc yöntemini kullanın; metadatayı (gerçekten dağınık) ekleyerek meta verisini (gerçekten dağınık) ekleyerek ya da yeniden bildirerek (
  • ), dinamik meta verileri (çok ve çok sayıda iş) sağlamak için bir özel TypeDescriptionProvider kullanın - tüketicinin TypeDescriptor; En bağlanma ile ilişkili tüketiciler, ama örneğin, (birçok LINQ sağlayıcıları tarafından kullanılan) Expression değil
  • değişikliği kod üreteci yapar/Kendi
  • (işi yapmak için PostSharp gibi bir şey genişletmek için deneyin ben cenneti yazmak 't bunu yapmanın bir yolunu bulduk ama bir yolunu bulursanız duymak aşk var!) bir sistem tanımlı özniteliği ([DisplayName], vb olmadığı sürece

genellikle, ilk seçeneği ile başarı). [ValidateNonEmpty] dinamik veriler tarafından tanımlanmışsa, bunu yapamayabilirsiniz.

+0

Teşekkür Marc,:

public interface IMyTable { [DatabaseGenerated(DatabaseGeneratedOption.Identity)] int ID { get; set; } } public partial class MyTable : IMyTable { } 

orijinal kodunu üretti. "MetadataType" sınıfımın özelliklerinden, öznitelikler hakkında bilgi almak istediğim noktada yinelemeyi başardım ve basitçe "meta" özelliğinin ismini gerçek mülkiyete göre karşılaştırıyorum. – GONeale

+0

Gerçek öznitelikleri sorgulamakla aynı şey değil, anlıyorum ama ihtiyacım olan şey bu durumda amaca hizmet edecek gibi görünüyor. Hangisi harika. – GONeale

+0

Umarım bu mantıklıdır. Şimdi bir doğrulama özniteliğinin bildirilip bildirilmediğini ve buna göre çalışabileceğimi görebiliyorum. Şimdi sadece metadataType öznitelik sınıfını kullanarak kendimle başa çıkmanın değil, sadece kendi sınıfımın özelliklerine bakmak için hangi sınıfı söyleyeceğimi umarım. – GONeale

1

Diğer bir seçenek, özellikleri aynı sınıftaki oluşturulmayan özelliklerin içine sarmaktır. İdeal değil çünkü çifte özelliklere sahip olabilirsiniz ama jeneratörü korumalı özellikler yapabilmeniz için oldukça iyi bir yaklaşım olacaktır.

Sadece bu sorunla başa çıkmak zorunda kaldım: Entity Framework sınıfları oluşturur, bunları daha basit adlarla JSON'a serileştirmek istiyorum.

// GENERATED BY EF 
public partial class ti_Users 
{ 
    public ti_Users() 
    { 
     this.ti_CardData = new HashSet<ti_CardData>(); 
     this.ti_Orders = new HashSet<ti_Orders>(); 
    } 

    protected int userId { get; set; } 
    protected string userName { get; set; } 
    protected string userEmail { get; set; } 
    protected string userPassHash { get; set; } 
    protected Nullable<System.DateTime> userLastLogin { get; set; } 
    protected string userLastIP { get; set; } 

    public virtual ICollection<ti_CardData> ti_CardData { get; set; } 
    public virtual ICollection<ti_Orders> ti_Orders { get; set; } 
} 

ve eklenti sınıfının: Oluşturulan sınıf kısmi sınıf olduğundan

[JsonObject(memberSerialization: MemberSerialization.OptIn)] 
public partial class ti_Users 
{ 
    [JsonProperty] 
    public int UserId 
    { 
     get { return this.userId; } 
     set { this.userId = value; } 
    } 

    [JsonProperty] 
    public string Name 
    { 
     get { return this.userName; } 
     set { this.userName = value; } 
    } 

    [JsonProperty] 
    public string Email 
    { 
     get { return this.userEmail; } 
     set { this.userEmail = value; } 
    } 

    [JsonProperty] 
    public string PassHash 
    { 
     get { return this.userPassHash; } 
     set { this.userPassHash = value; } 
    } 
} 
6

aşağıdaki çalışması gerekir:

  1. ilan bu özelliği bir arayüz oluşturma bu ve ValidateNonEmpty özniteliği ile süsleyin.
  2. AutoGenerated sınıfı ile aynı ada sahip kendi kısmi sınıfınızı oluşturun ve bunu oluşturduğunuz arabirimi gerçekleştirin.

    // Decorate the properties with attributes as required 
    public interface IMyInterface 
    { 
        [ValidateNonEmpty("Name is required")] 
        string Name { get; set; } 
    } 
    
    // This is the partial class I created, that implements the interface 
    public partial class MyGeneratedClass : IMyInterface 
    {  
    } 
    
    // This is the auto-generated class 
    public partial class MyGeneratedClass 
    { 
        public virtual string Name { get; set; } 
    } 
    

    ben geekswithblogs bu fikrim var:

  3. özellik şimdi bu özelliğe Örneğin

süslenmiş edilmelidir.

+0

Daha sonra, bir çok üretken sınıfınız ve bir çok özelliğiniz varsa, temel sınıfınızdaki her bir özelliğe, aynı zamanda arayüze, sıkıcı bir alıştırmaya ihtiyacınız olacaktır. – secretwep

2

Bu harika bir çözümdür, ancak sorunum için çalışmadı. Varolan bir veritabanından kod ilk üretilen sınıfları ile EF 6 kullanıyorum. Tablodaki sütunlardan biri, otomatik oluşturulan değerlere sahip bir KİMLİK. Ancak, oluşturulan kısmi sınıf, veritabanının anahtarı oluşturması için gereken [DatabaseGenerated (DatabaseGeneratedOption.Identity)] özniteliğini sağlamamıştır. Sonuç, "" IDENTITY_INSERT öğesi OFF olarak ayarlandığında "mytable" tablosunda kimlik sütunu için açık değer eklenemiyor. ". Çözümünüzü denedim ama işe yaramadı. Ancak, özniteliği orijinal oluşturulan sınıfa eklerseniz, çalışır. Bu yüzden hala otomatik oluşturulan dosyanın değiştirilmesini gerektirmeyen bir çözüm bulmaya çalışıyorum. İşte

Ben senin çözüm kullanarak çalıştı kodu: Ben bu durumda olabileceğini düşündüm

[Table("MyTable")] 
public partial class MyTable 
{ 
    [Key] 
    [Column(Order = 1)] 
    public int ID { get; set; } 
} 
İlgili konular