2010-11-26 13 views
14

पर पैरामीटर के रूप में कक्षा का पास उदाहरण मुझे कस्टम कस्टम विशेषता के भीतर कक्षा/मॉडल (गैर-स्थैतिक सदस्य तक पहुंचने के उद्देश्य के लिए) के उदाहरण की आवश्यकता है।गुण कन्स्ट्रक्टर

public class LoginModel 
{ 
    [AutoComplete(currentInstance)] //pass instance of class or CompanyNames 
    public string DepartmentName { get; set; } 


    public string[] DepartmentNames { get {...} } 
} 

वहाँ new() या प्रतिबिंब का उपयोग किए बिना यह करने के लिए एक रास्ता है।

उत्तर

13

यह पूरी तरह असंभव है। गुणों को संकलन-समय पर असेंबली के मेटाडेटा में बेक किया जाता है, इसलिए किसी गुण के लिए के उदाहरण के बारे में बात करने से कोई अर्थ नहीं होता है क्योंकि उदाहरण केवल रनटाइम पर मौजूद होते हैं।

दूसरी ओर विशेषताओं को प्रतिबिंब द्वारा हमेशा उपभोग किया जाता है, इसलिए मुझे लगता है कि इस समय आप कक्षा मेटाडेटा पर इस कस्टम विशेषता की उपस्थिति की जांच कर रहे हैं, आप उदाहरण का उपयोग कर सकते हैं।

+0

वहाँ वर्ग उदाहरण या विधि के लिए विशेषता से डेटा पारित करने के लिए एक तरीका है? (उदाहरण के लिए एक विशेषता प्रमाणीकरण कर सकती है और प्रमाणीकृत उपयोगकर्ता को विधि में पास कर सकती है?) –

+1

और यह कुल सीमा है, अब तक की सबसे बड़ी सी #/.NET सीमाओं में से एक है। बहुत निराश। – liang

2

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

3

असंभव व्यक्ति, आप विशेषता के निर्माता में उदाहरण, प्रतिनिधि, लैम्ब्डा अभिव्यक्ति पास नहीं कर सकते हैं। कुछ here

0

https://msdn.microsoft.com/en-us/library/aa288454(v=vs.71).aspx MSDN के आधार पर पर इसके बारे में चर्चा करते हैं, यह पूरी तरह से करता है, तो आप यहाँ पर कार्रवाई करने के वर्ग का एक उदाहरण उत्तीर्ण करने की आवश्यकता नहीं किया जा सकता है। सरल प्रकार (bool, बाइट, चार, लघु, पूर्णांक, लंबे, नाव, और डबल) स्ट्रिंग System.Type enums वस्तु (करने के लिए तर्क:

गुण मापदंडों निम्नलिखित प्रकार के निरंतर मूल्यों तक ही सीमित हैं प्रकार वस्तु का एक विशेषता पैरामीटर में से एक के ऊपर प्रकार की एक निरंतर मूल्य से ऊपर प्रकार

इसके अलावा में से किसी से एक आयामी सरणी होना चाहिए।), तो आपको समझा सकता है इसलिए हम विशेषता संदर्भ और जरूरत में खड़े अपनी वस्तु से जानकारी प्राप्त करें। यह अजीब लगता है क्योंकि हम अक्सर ऑब्जेक्ट के बारे में अधिक जानकारी देने के लिए विशेषता का उपयोग करते हैं लेकिन ऑब्जेक्ट डेटा को नहीं पढ़ते हैं।

0

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

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

public class NoneValidationMode : RequiredValidationMode 
{ 
    public NoneValidationMode() { } 
    public override bool IsValid(string properties, object value) 
    { 
     //validation code here 
    } 
} 

public class AllValidationMode: RequiredValidationMode 
{ 
    public override bool IsValid(string properties,object value) 
    { 
     //validation code here 
    } 
} 

public class AtLeastOneValidationMode : RequiredValidationMode 
{ 
    public override bool IsValid(string properties, object value) 
    { 
     //validation code here 
    } 
} 
public abstract class RequiredValidationMode 
{ 
    public abstract bool IsValid(string properties, object value); 
} 
  • अब यहाँ:

    • यहाँ सब सत्यापन प्रकार एक गणन

      [Flags] 
      public enum AlgorithmTypes 
      { 
          None = 0, 
          All = 1, 
          AtLeastOne = 2 
      } 
      
    • अब एक रणनीति पैटर्न में उन सभी को लपेट में प्रतिनिधित्व कर रहे हैं: यहाँ एक व्यावहारिक उदाहरण है फैक्टरी पैटर्न है जो आपके लिए सही उदाहरण बनाने के लिए ज़िम्मेदार है:

      public class AlgorithmStrategyFactory 
      { 
          private static ArrayList _registeredImplementations; 
      
          static AlgorithmStrategyFactory() 
          { 
           _registeredImplementations = new ArrayList(); 
           RegisterClass(typeof(NoneValidationMode)); 
           RegisterClass(typeof(AllValidationMode)); 
           RegisterClass(typeof(AtLeastOneValidationMode)); 
          } 
          public static void RegisterClass(Type requestStrategyImpl) 
          { 
           if (!requestStrategyImpl.IsSubclassOf(typeof(RequiredValidationMode))) 
            throw new Exception("requestStrategyImpl must inherit from class RequiredValidationMode"); 
      
           _registeredImplementations.Add(requestStrategyImpl); 
          } 
          public static RequiredValidationMode Create(AlgorithmTypes algorithmType) 
          { 
           // loop thru all registered implementations 
           foreach (Type impl in _registeredImplementations) 
           { 
            // get attributes for this type 
            object[] attrlist = impl.GetCustomAttributes(true); 
      
            // loop thru all attributes for this class 
            foreach (object attr in attrlist) 
            { 
             if (attr is AlgorithmAttribute) 
             { 
              if (((AlgorithmAttribute)attr).AlgorithmType.Equals(algorithmType)) 
              { 
               return (RequiredValidationMode)System.Activator.CreateInstance(impl); 
              } 
             } 
            } 
           } 
           throw new Exception("Could not find a RequiredValidationMode implementation for this AlgorithmType"); 
          } 
      } 
      
    • अब कक्षाओं में सत्यापन विशेषता का उपयोग किया जा सकता है, कन्स्ट्रक्टर एक एल्गोरिदम टाइप स्वीकार कर रहा है जो बाद में निर्दिष्ट करने जा रहा है कि एल्गोरिदम को किस प्रकार उठाया जाना चाहिए और बुलाया जाना चाहिए।

      [AttributeUsage(AttributeTargets.Class, AllowMultiple =false)] 
      public class MyAttribute : ValidationAttribute 
      { 
          AlgorithmTypes AlgorithmType; 
      
          public MyAttribute(AlgorithmTypes algorithm = AlgorithmTypes.None) 
          { 
           AlgorithmType = algorithm; 
          } 
      
          public override bool IsValid(object value) 
          { 
      
           return (AlgorithmStrategyFactory.Create(AlgorithmType)).IsValid(Properties, value); 
          } 
      }  
      
  • संबंधित मुद्दे