2010-05-19 11 views
14

मैं एक कस्टम विशेषता बनाना चाहता हूं जिसका उपयोग किसी प्रॉपर्टी पर किया जा सकता है जैसे:एक कस्टम विशेषता के माध्यम से संपत्ति मूल्य कैसे प्राप्त करें और संशोधित करें?

[TrimInputString] 
public string FirstName { get; set; } 

जो

private string _firstName 
public string FirstName { 
    set { 
    _firstName = value.Trim(); 
    } 
    get { 
    return _firstName; 
    } 
} 

के कार्यात्मक समकक्ष होगा, इसलिए मूल रूप से प्रत्येक बार संपत्ति सेट होने पर मान को छंटनी की जाएगी।

मैं मूल्य को पार्स कैसे प्राप्त करूं, उस मान को संशोधित करूं और फिर संपत्ति को नए मूल्य के साथ विशेषता के भीतर से सेट कर सकूं?

[AttributeUsage(AttributeTargets.Property)] 
public class TrimInputAttribute : Attribute { 

    public TrimInputAttribute() { 
    //not sure how to get and modify the property here 
    } 

} 
+0

मुझे लगता है कि एक बेहतर तरीका डेटाबिंडर है: http://stackoverflow.com/a/1734025/7720 – Romias

उत्तर

6

यह नहीं है कि गुण कैसे काम करते हैं। आप कन्स्ट्रक्टर के भीतर से जो भी विशेषता संलग्न कर सकते हैं उसे एक्सेस नहीं कर सकते हैं।

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

1

जैसा कि माती ने बताया, यह नहीं है कि गुण कैसे काम करते हैं। हालांकि, आप इसे पूरा करने के लिए PostSharp AOP framework का उपयोग कर सकते हैं, शायद OnMethodBoundaryAspect को ओवरराइड कर सकते हैं। लेकिन यह मामूली नहीं है।

7

iam यह नहीं बहुत समझाने तरीका कर रही है, लेकिन इसकी लोअरकेस के लिए काम

डेमो वर्ग

public class User 
{ 

[TitleCase] 
public string FirstName { get; set; } 

[TitleCase] 
public string LastName { get; set; } 

[UpperCase] 
public string Salutation { get; set; } 

[LowerCase] 
public string Email { get; set; } 

} 

लेखन गुण, दूसरों के समान तरीके से लिखा जा सकता है

public class LowerCaseAttribute : ValidationAttribute 
{ 
    protected override ValidationResult IsValid(object value, ValidationContext validationContext) 
    { 
     //try to modify text 
      try 
      { 
       validationContext 
       .ObjectType 
       .GetProperty(validationContext.MemberName) 
       .SetValue(validationContext.ObjectInstance, value.ToString().ToLower(), null); 
      } 
      catch (System.Exception) 
      {          
      } 

     //return null to make sure this attribute never say iam invalid 
     return null; 
    } 
} 

वास्तव में कार्यान्वयन प्रमाणीकरण विशेषता के रूप में बहुत ही सुरुचिपूर्ण तरीका नहीं है यह

+0

यह, केवल तभी काम करता है जब आपका प्रोग्राम किसी बिंदु पर ऑब्जेक्ट्स पर सत्यापन चलाता है। दिलचस्प हैक, लेकिन मैं इसे उत्पादन कोड में उपयोग नहीं करता। –

+1

हो सकता है कि आप 'ValidationResult.Success; ' – Nikola

0

यह Dado.ComponentModel.Mutations के साथ किया जा सकता है।

public class User 
{ 
    [Trim] 
    public string FirstName { get; set; } 
} 

// Then to preform mutation 
var user = new User() { 
    FirstName = " David Glenn " 
} 

new MutationContext<User>(user).Mutate(); 

आप और अधिक प्रलेखन here देख सकते हैं।

+0

वापस लौटना चाहें, समाधान के बारे में निर्णय नहीं लेना। लेकिन चुना गया नामस्थान मुझे भ्रामक लगता है। मेरी पहली छाप यह है कि यह नेट फ्रेमवर्क का हिस्सा है। हालांकि यह नहीं है। RoyDukkey.ComponentModel.Mutations के साथ नेमस्पेस क्यों शुरू नहीं करें और अपने नाम को भी क्रेडिट दें। –

+0

मैं सहमत हूं। यह मूल रूप से एक प्रस्ताव के रूप में बनाया गया था, लेकिन तब से बंद कर दिया गया है। मेरे पास अभी तक नामस्थान को कुछ और उचित में बदलने का समय है। – roydukkey

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

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