2010-10-13 19 views
6

मैं एक विशेषता बनाया है, तो:कस्टम विशेषता पैरामीटर मान पुनर्प्राप्त करें?

public class TableAttribute : Attribute { 
    public string HeaderText { get; set; } 
} 

जो मैं मेरे विचार में एक वर्ग

public class Person { 
    [Table(HeaderText="F. Name")] 
    public string FirstName { get; set; } 
} 

में मेरे गुण के कुछ करने के लिए लागू मैं लोगों जो मैं एक में प्रदर्शित कर रहा हूँ की एक सूची है टेबल .. मैं अपने कॉलम हेडर के रूप में उपयोग करने के लिए हेडरटेक्स्ट के मान को कैसे प्राप्त कर सकता हूं? कुछ की तरह ...

<th><%:HeaderText%></th> 

उत्तर

23

इस मामले में, आप पहली बार प्रासंगिक PropertyInfo पुनः प्राप्त करना चाहते हैं, तो MemberInfo.GetCustomAttributes फोन (अपने विशेषता प्रकार में गुजर)। परिणाम को अपने विशेषता प्रकार की सरणी में कास्ट करें, फिर HeaderText संपत्ति सामान्य के रूप में प्राप्त करें। नमूना कोड:

using System; 
using System.Reflection; 

[AttributeUsage(AttributeTargets.Property)] 
public class TableAttribute : Attribute 
{ 
    public string HeaderText { get; set; } 
} 

public class Person 
{ 
    [Table(HeaderText="F. Name")] 
    public string FirstName { get; set; } 

    [Table(HeaderText="L. Name")] 
    public string LastName { get; set; } 
} 

public class Test 
{ 
    public static void Main() 
    { 
     foreach (var prop in typeof(Person).GetProperties()) 
     { 
      var attrs = (TableAttribute[]) prop.GetCustomAttributes 
       (typeof(TableAttribute), false); 
      foreach (var attr in attrs) 
      { 
       Console.WriteLine("{0}: {1}", prop.Name, attr.HeaderText); 
      } 
     } 
    } 
} 
0

जॉन स्कीट के समाधान अच्छा है अगर आप एक ही प्रकार के अनेक विशेषताएं एक संपत्ति पर घोषित करने की अनुमति देते हैं। (AllowMultiple = true)

पूर्व:

[Table(HeaderText="F. Name 1")] 
[Table(HeaderText="F. Name 2")] 
[Table(HeaderText="F. Name 3")] 
public string FirstName { get; set; } 

आपके मामले में, मैं यह मान लेगा कि केवल चाहते हैं एक विशेषता संपत्ति प्रति अनुमति दी। इस मामले में, आप कस्टम विशेषता के गुणों का उपयोग कर सकते हैं:

var tableAttribute= propertyInfo.GetCustomAttribute<TableAttribute>(); 
Console.Write(tableAttribute.HeaderText); 
// Outputs "F. Name" when accessing FirstName 
// Outputs "L. Name" when accessing LastName 
संबंधित मुद्दे