2012-01-24 9 views
6

क्या किसी संपत्ति पर एक विशेषता असाइन करना और अन्य विशेषताओं को असाइन करने के लिए इसका उपयोग करना संभव है - प्रतिबिंब का उपयोग किए बिना ऐसा करना?सी # गुण: सभी को नियम देने के लिए एक विशेषता?

कोड:

public class CashierOut : BaseActivity 
{ 
    [Description("Flag indicates whether break to execution.")] 
    [DefaultValue(false)] 
    [MyCustomAttribute(ParameterGroups.Extended)] 
    public bool CancelExecution { get; set; } 

    [Description("Flag indicates whether allow exit before declation.")] 
    [DefaultValue(true)] 
    [MyCustomAttribute(ParameterGroups.Extended)] 
    [DisplayName("Exit before declaration?")] 
    public bool AllowExitBeforeDeclare { get; set; } 
} 

मैं कुछ इस तरह करना चाहते हैं:

public class CashierOut : BaseActivity 
{ 
    [MyResourceCustom("CashierOut.CancelExecution")] 
    public bool CancelExecution { get; set; } 

    [MyResourceCustom("CashierOut.AllowExitBeforeDeclare")] 
    public bool AllowExitBeforeDeclare { get; set; } 
} 

public sealed class MyResourceCustom : Attribute 
{ 
    public string ResourcePath { get; private set; } 

    public ParameterGroupAttribute(string resourcePath) 
    { 
     ResourcePath = resourcePath; 

     // Get attributes attributes value from external resource using the path. 
    } 
} 
+0

मुझे बहुत यकीन है कि, विशेष रूप से प्रतिबिंबों द्वारा विशेषताओं का उपयोग किया जाता है और मुझे नहीं लगता कि आप इसे फकी कर सकते हैं और फिर भी इसे प्रतिबिंब के साथ देखा जा सकता है –

उत्तर

6

गुण बस सदस्यों वे पर परिभाषित कर रहे हैं करने के लिए मेटा डेटा जोड़ने - खुद से वे कुछ नहीं कर।

विशेषता मानों के आधार पर आपको कुछ व्यवहार उत्पन्न करने के लिए प्रतिबिंब का उपयोग करना होगा।

इस प्रकार सभी विशेषताएं काम करती हैं - कुछ टूलिंग कुछ विशेषताओं (जैसे कंपाइलर और ConditionalAttribute) से अवगत है, लेकिन यह अभी भी प्रतिबिंब के माध्यम से किया जाता है।

2

पहलू ओरिएंटेड प्रोग्रामिंग में देखें। आप संकलित या रनटाइम पर अपने कोड को संशोधित करने के लिए postsharp जैसे टूल का उपयोग कर सकते हैं।

1

आप MyResourceCustom पर एक सदस्य जोड़ सकते हैं जो एक अपरिवर्तनीय उदाहरण में वर्णन, डिफ़ॉल्ट वैल्यू और MyCustomAttribute को लपेटता है (शायद यहां तक ​​कि एक स्थिर वैश्विक, यदि यह सभी के लिए समान हो)।

public class MyResourceCustom : Attribute { 
    public MyResourceCustomDescriptor Descriptor { get; private set; } 
    public MyResourceCustom(MyResourceCustomDescriptor descriptor) 
    : base() { 
    Descriptor = descriptor; 
    } 

public class MyResourceCustomDescriptor { 
    public string   Description { get; private set; } 
    public bool   DefaultValue { get; private set; } 
    public ParameterGroups ParameterGroup { get; private set; } 

    public MyResourceCustomDescriptor(string path) { 
    // read from path 
    } 
} 

public class MyAdvancedResouceCustomDescriptor : MyResourceCustomDescriptor { 
    public string DisplayName { get; private set; } 
    // etc... 
} 

जब आप विशेषता लाने आप अपने Descriptor संपत्ति हो और मूल्यों पढ़ सकते हैं।

एक साइडेनोट के रूप में, आपको इसे IsDefaultValue नाम देना चाहिए।

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