2009-06-10 18 views
9

मैं वास्तव में विशेषताओं को समझ नहीं पा रहा हूं। मैंने उन सभी प्रकार की किताबें & पोस्ट पढ़ी हैं, लेकिन मुझे बस यह नहीं मिला है।डॉटनेट/.NET में कस्टम विशेषताओं को लागू करने का सबसे अच्छा तरीका क्या है?

चूंकि मैं उन्हें समझ नहीं पा रहा हूं, इसलिए मुझे समझ में नहीं आता कि प्रभावी ढंग से उनका उपयोग कैसे किया जाए।

1) क्या आप मुझे एक अच्छी परिभाषा दे सकते हैं कि & क्या इसका उपयोग किया जाता है?

2) क्या आप कस्टम विशेषता बनाने और उपभोग करने के तरीके के बारे में सी # में एक अच्छा कोड उदाहरण दे सकते हैं?

उत्तर

9

कहें कि आपके पास प्रतिबिंब का उपयोग करके चलने वाले गुणों की एक श्रृंखला के साथ एक कक्षा है। स्ट्रिंग वाले किसी भी व्यक्ति को यह जांचने के लिए सत्यापित किया जाना चाहिए कि वे एक निश्चित राशि से अधिक नहीं हैं।

फिर आप डिफ़ॉल्ट पूर्णांक कन्स्ट्रक्टर और पूर्णांक गुण/फ़ील्ड के साथ टेक्स्ट लम्बाई विशेषता बना सकते हैं। फिर आप अपनी कक्षा में प्रत्येक स्ट्रिंग प्रॉपर्टी पर अपनी विशेषता पढ़ सकते हैं और गुण में उल्लिखित संख्या में संपत्ति मान की लंबाई की तुलना कर सकते हैं।

कोड:

public class TextLengthAttribute : Attribute 
{ 
    private int length; 
    public int Length { get { retrun length; } set { length = value; } } 

    public TextLengthAttribute(int num) { this.length = num ; } 
} 

public class MyClass 
{ 

    [TextLength(10)] 
    public string Property1; 
    [TextLength(20)] 
    public string Property2; 
} 

public class ClassReader 
{ 
    public static void Main() 
    { 
      MyClass example = MyClass.GetTestData(); 

      PropertyInfo[] props = typeof(MyClass).GetProperties(); 
      foreach (PropertyInfo prop in props) 
      { 
       if (prop.ValueType == typeof(String) 
       { 
        TextLengthAttribute[] atts = 
         (TextLengthAttribute)[]prop.GetCustomAttributes(
          typeof(TextLengthAttribute), false); 
        if (prop.GetValue(example, null).ToString().Length > 
         atts[0].Length) 
         throw new Exception(prop.name + " was too long"); 
       } 
      } 
    } 
} 

नोट: अपरीक्षित

2

उदाहरण के लिए बहुत कुछ है log4PostSharp। वे एओपी व्यवहार शुरू करने के लिए विशेषताओं का उपयोग करते हैं।

यही है एक विशेषता मैं एक बार इस्तेमाल किया, गुण एक इकाई देने के लिए (सेकंड, मीटर की तरह, ...)

[AttributeUsage(AttributeTargets.Property)] 
public sealed class UnitAttribute : Attribute 
{ 
    public UnitAttribute(Unit unit) 
    { 
    Unit = unit; 
    } 

    public Unit Unit { get; private set; } 
} 

यह इस तरह, गुणों पर इस्तेमाल किया गया था:

[Unit(Unit.Meter)] 
public float Distance { get; set; } 

आप बाद में इसे GUI पर दिखाने के लिए विशेषता पुनर्प्राप्त कर सकते हैं।

11

मैं आपको एक उदाहरण देता सकता है, लेकिन यह इस ठीक लेख की तुलना में पीली होगा:

Defining and Using Custom Attribute Classes in C#

जटिल, घटक शैली विकास कि कारोबार आधुनिक सॉफ्टवेयर डेवलपर्स से बाहर उम्मीद की आवश्यकता है अतीत की डिजाइन पद्धतियों की तुलना में अधिक डिज़ाइन लचीलापन। माइक्रोसॉफ्ट के .NET Framework प्रदान करने के लिए विशेषताओं का व्यापक उपयोग "घोषणात्मक" प्रोग्रामिंग के रूप में जाना जाता है के माध्यम से अतिरिक्त कार्यक्षमता प्रदान करता है। गुण सॉफ़्टवेयर सिस्टम में लचीलापन बढ़ाते हैं क्योंकि वे कार्यक्षमता के ढीले युग्मन को बढ़ावा देते हैं। क्योंकि आप अपना खुद का कस्टम विशेषता वर्ग बना सकते हैं और फिर पर कार्य कर सकते हैं, तो आप अपने अपने उद्देश्यों के लिए गुणों की युग्मन शक्ति का लाभ उठा सकते हैं।

2

एक विशेषता किसी भी सदस्य (खेतों, वर्ग आदि) के बारे में मेटा डेटा प्रदान करने के लिए प्रयोग किया जाता है।

आप Attribute से विरासत में उन्हें बनाकर बना सकते हैं, और उन्हें Attribute.GetCustomAttribute विधि का उपयोग कर उपभोग कर सकते हैं।

एक डिफ़ॉल्ट विशेषता का एक उदाहरण PrincipalPermissionAttribute है जो केवल प्रमाणित उपयोगकर्ताओं को कुछ संसाधनों तक पहुंचने की अनुमति देता है।उदाहरण के लिए:

[PrincipalPermission (SecurityAction.Demand, Role="Supervisor")] 
public class DoTheThingPage : Page 
{ 
    //// 
} 

इस उदाहरण में, हम एक ASP.NET पेज है कि केवल एक प्रमाणीकृत उपयोगकर्ता है कि 'पर्यवेक्षक की भूमिका के अंतर्गत आता है द्वारा देखी जा सकती है।

(यह विशेषता स्वचालित रूप से ASP.NET में सुरक्षा उप-प्रणाली द्वारा पढ़ा जाता है) भी ध्यान रखें कि 'गुण' वर्ग के नाम के हिस्से का उपयोग नहीं किया गया था, यह नेट के भीतर एक सम्मेलन है।

3

हमें एक विशिष्ट क्रम क्रम में ड्रॉपडाउन में एनम वैल्यू प्रदर्शित करने की आवश्यकता है। हमने कस्टम विशेषताओं का उपयोग करके कार्यान्वित किया।

[AttributeUsage(AttributeTargets.Enum | AttributeTargets.Field, AllowMultiple = false)] 
public class EnumSortAttribute : Attribute 
{ 
    public int SortOrder; 
    public bool SortByDescription; 
} 

[EnumSort(SortByDescription=true)] 
public enum EnumSortByDescription 
{ 
    [Description("enO")] 
    One = 1, 
    [Description("2")] 
    Two = 2, 
    Three = 3, 
    [Description("rouF")] 
    Four = 4 
} 

public enum EnumCustomSortOrder 
{ 
    [EnumSort(SortOrder = 3)] 
    One = 1, 
    [EnumSort(SortOrder = 1)] 
    Two = 2, 
    [EnumSort(SortOrder = 2)] 
    Three = 3 
} 
1

गुण सिर्फ एक में अतिरिक्त जानकारी (मेटाडाटा) वर्ग, struct या कुछ सदस्य को जोड़ने के लिए तरीका है। कुछ निर्णय लेने के लिए यह मेटा-डेटा अन्य कोड द्वारा पुनर्प्राप्त किया जा सकता है।

सरल उदाहरणSerializableAttribute .NET से है। यह इंगित करता है कि कक्षा को बाद में बाइनरीफॉर्मेटर द्वारा क्रमबद्ध किया जा सकता है।

यहाँ एक और उदाहरण है - हम से संकेत मिलता है कि वे किसी भी परिवर्तनशील क्षेत्रों की जरूरत नहीं है और मल्टी-थ्रेडेड कार्यों के लिए ठीक हैं ImmutableAttribute के साथ हमारे कोड में कुछ वर्गों को चिह्नित कर सकते हैं:

[Immutable] 
public sealed class ProcessingMessage 
{ 
    //... some code that should be thread-safe 

} 

फिर, हम एक इकाई परीक्षण बना सकता है जो विशेषता के साथ सभी वर्गों को पाता है और यह सुनिश्चित करता है कि they are immutable indeed:

[Test] 
public void Immutable_Types_Should_Be_Immutable() 
{ 
    var decorated = GlobalSetup.Types 
    .Where(t => t.Has<ImmutableAttribute>()); 

    foreach (var type in decorated) 
    { 
    var count = type.GetAllFields().Count(f => !f.IsInitOnly && !f.IsStatic); 
    Assert.AreEqual(0, count, "Type {0} should be immutable", type); 
    } 
} 
संबंधित मुद्दे

 संबंधित मुद्दे