C # डेटा एनोटेशन, एक विशिष्ट विशेषता का विस्तार नहीं कर सकता है - क्या संभावनाएं हैं?

वोट
39

मैं ASP.NET डायनेमिक डेटा के साथ एक लीगेसी एप्लिकेशन बिल्ड पर काम कर रहा हूं। मॉडल, हमेशा की तरह, सभी केवल-पढ़ने के लिए हैं और एक प्रदर्शन नाम या विवरण विशेषताओं के माध्यम से सेट कर सकते हैं।

यह अच्छी तरह से काम किया, हालांकि, अब मैं ऐसी स्थिति में हूं जहां मुझे प्रदर्शन नाम के लिए दो अलग-अलग स्रोतों (संसाधन फ़ाइल और कुछ अन्य स्रोत) को क्वेरी करने की आवश्यकता है।

इससे पहले कोड साफ था, क्योंकि हमने केवल संसाधनों की खोज की थी:

[Display(ResourceType = typeof(Resources.m_Res), Name = M_RES_MIMETYPE_ID, Description = M_RES_MIMETYPE_ID_DESCR)]

यह पूरी तरह से ठीक था और इसने काम किया। हालाँकि, अब मुझे सबसे पहले डिस्प्ले का नाम और विवरण किसी अन्य फाइल से प्राप्त करना होगा और यदि बाकी सब विफल हो जाता है, तो मुझे संसाधनों में कमी करनी होगी।

मुझे दो अलग-अलग कस्टम विशेषताएँ बनानी थीं, कुछ इस तरीके से:

    public class MGADisplayName : DisplayNameAttribute
    {
          private readonly string propertyName;
          public string Name { get; set; }
          public Type TableName { get; set; }
          public Type ResourceType { get; set; }

          public MGADisplayName([CallerMemberName] string PropertyName = null)
          {
              propertyName = PropertyName;
          }

          public override string DisplayName
          {
              get
              {
                  var key = (TableName.Name + : + (propertyName ?? Name)).ToLower();
                  if (/* SOME QUERYING */)
                  {
                      return QUERY[key];
                  }
                  else
                  {
                      string property = Resources.m_Res.ResourceManager.GetString(Name);
                      if (property != null)
                      {
                          return property;
                      }
                      else
                      {
                          return Name;
                      }

                  }
              }
          }
    }

इस तरह के काम करता है और मुझे लगता है कि यह समय के लिए ठीक है, लेकिन अगला मुद्दा कोने के आसपास है: मुझे Display.GroupName के साथ ऐसा करने की आवश्यकता होगी।

अब, जहां तक मुझे पता है, कोई भी ग्रुपनेम एट्रिब्यूट का विस्तार करने के लिए नहीं है, इसलिए मैं यहां अंधेरे में हूं।

काश मैं DisplayAttribute का विस्तार कर सकता, यह वास्तव में मुझे क्या चाहिए, लेकिन वर्ग को सील कर दिया जाता है, इसलिए यह एक मृत अंत है।

काश मैं मक्खी पर मॉडल को बदल सकता था और बसने वालों के माध्यम से डिस्प्लेनेम और विवरण प्रदान कर सकता था, लेकिन मॉडल में केवल गेटर्स हैं, इसलिए यह एक और मृत अंत है।

मैं यहां विकल्पों में से धीरे-धीरे चल रहा हूं। यहां और क्या किया जा सकता है?

28/04/2020 को 13:24
का स्रोत उपयोगकर्ता
अन्य भाषाओं में...                            


1 जवाब

वोट
0

हालाँकि DisplayAttribute को सील्ड के रूप में चिह्नित किया गया है, फिर भी आप इसे विस्तार विधि का उपयोग करते हुए बढ़ा सकते हैं, जैसे कि निम्नलिखित कुछ:

public static class DisplayAttributeExtensions
{
    public static string GetGroupName(this DisplayAttribute display)
    {
        // TODO: your implementation logic
    }
}

यह संभावित रूप से आपकी समस्या को हल कर सकता है क्योंकि यह प्रदर्शन विधि सभी DisplayAttribute उदाहरणों के माध्यम से कॉल की जा सकती है।

https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/classes-and-structs/extension-methods

21/05/2020 को 20:51
का स्रोत उपयोगकर्ता

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more