2010-07-20 14 views
22

Ben özelliklerine uygulanabilir aşağıdaki özel niteliği, adres: ÖrneğinÖzel Ayrıntı - Alma türüne ve atfedilen özelliğinin değerine

[AttributeUsage(AttributeTargets.Property, AllowMultiple = false)] 
public class IdentifierAttribute : Attribute 
{ 
} 

:

public class MyClass 
{ 
    [Identifier()] 
    public string Name { get; set; } 

    public int SomeNumber { get; set; } 
    public string SomeOtherProperty { get; set; } 
} 

da olacak Tanımlayıcı özniteliğinin farklı türde özelliklerine eklenebileceği diğer sınıflar:

public class MyOtherClass 
{ 
    public string Name { get; set; } 

    [Identifier()] 
    public int SomeNumber { get; set; } 

    public string SomeOtherProperty { get; set; } 
} 

Daha sonra bu bilgiyi tüketim sınıfım içinde alabilmem gerekiyor.

public class TestClass<T> 
{ 
    public void GetIDForPassedInObject(T obj) 
    { 
     var type = obj.GetType(); 
     //type.GetCustomAttributes(true)??? 
    } 
} 

bu olmanın en güzel yolu nedir Örneğin: ? [Identifier()] alanının (int, string, vb ...) türünü ve gerçekte, türüne bağlı olarak gerçek değeri almam gerekir. Aşağıdaki gibi

cevap

30

şey ,, bu o niteliği vardır genelinde, tabii ki birden fazla üzerine koyun olabilir gelir sadece ilk özelliği ..

public object GetIDForPassedInObject(T obj) 
    { 
     var prop = typeof(T).GetProperties(BindingFlags.Public | BindingFlags.Instance) 
        .FirstOrDefault(p => p.GetCustomAttributes(typeof(IdentifierAttribute), false).Count() ==1); 
     object ret = prop !=null ? prop.GetValue(obj, null) : null; 

     return ret; 
    } 
+0

sayesinde kullanacaktır - can' FirstOrDefault içinde lambda içinde "prop" kullanın, ama ben onu sıralıyorum :-) – Alex

+0

Ahh evet, notepad ;-) olarak yazıyordu. –

+1

Özelliğimi [Identifier()] ile işaretledim ancak .GetProperties() bu özellik haricinde diğer tüm özellikleri döndürüyor mu ?! özniteliğim gizleniyor gibi görünüyor? – Alex

2
public class TestClass<T> 
{ 
    public void GetIDForPassedInObject(T obj) 
    { 
     PropertyInfo[] properties = 
      obj.GetType().GetProperties(BindingFlags.Public | BindingFlags.Instance);    

     PropertyInfo IdProperty = (from PropertyInfo property in properties 
          where property.GetCustomAttributes(typeof(Identifier), true).Length > 0 
          select property).First(); 

     if(null == IdProperty) 
      throw new ArgumentException("obj does not have Identifier."); 

     Object propValue = IdProperty.GetValue(entity, null) 
    } 
} 
İlgili konular