2012-05-18 13 views
5

मुझे अपनी बेस क्लास पर स्थिर विधि बनाने की आवश्यकता का सामना करना पड़ रहा है, लेकिन मुझे यह पसंद नहीं है कि मुझे तर्क तर्क घोषित करना है, इसलिए मुझे आश्चर्य है कि मैं इसके बारे में जा रहा हूं सही तरीका।स्थैतिक विधि को परिभाषित करने का बेहतर तरीका

मूल रूप से, मैं प्रतिनिधियों को असाइन कर रहा हूं कि मैं कक्षा पर गुणों के साथ संबद्ध हूं। मैं आसानी से इसलिए की तरह, विरासत में मिला वर्गों पर विधि डाल सकता है:

public class Foo 
{ 
    public string Property1 { get; set; } 
} 

public class InheritsFoo : Foo 
{ 
    public void AssignDel<TVal>(
     Expression<Func<InheritsFoo, TVal>> expr, 
     Action<InheritsFoo, TVal> action) 
    { 
    } 
} 

या, एक विस्तार कक्षा में, मैं ऐसा कर सकता है:

public static void AssignDel<T, TVal>(
    this T source, 
    Expression<T, TVal>> expression, 
    Action<T, TVal> action) 
    where T : Foo 
{ 
} 

इन दोनों में AssignDel उपयोग करने के लिए मुझे सक्षम होगा एक instantiated वर्ग:

var foo = new InheritsFoo(); 
foo.AssignDel(x => x.Property1, handler); 

लेकिन मैं AssignDel स्थिर बनाने के लिए एक आवश्यकता है। यह इसे बेकार करने का विस्तार तरीका बनाता है। यह अभी भी InheritsFoo में काम करता है, लेकिन मैं वास्तव में इसे बेस क्लास में ले जाना चाहता हूं। अगर मैं कोशिश, जेनरिक तर्क अनुमान लगाया जा सकता है, और मैं विधि के उपयोग बदलने के लिए:

InheritsFoo.AssignDel<InheritsFoo, string>(x => x.Property1, handler); 

यहाँ इस मैं के बारे में सोचा नहीं है ऐसा करने का एक और तरीका है एक तरह से वहाँ है?

संपादित करें: इस बारे में टिप्पणियों में इस मुद्दे को हल करने के लिए कि क्या एक्सटेंशन विधि काम करेगी या नहीं ... मैं @ मार्क एम द्वारा संदर्भित यूआरएल में गया। यह पता चला कि अगर मैं इसे इस तरह लिखता हूं ...

InheritsFoo foo = null; 
foo.AssignDel(x => x.Property1, handler); 

यह संकलित करता है (हालांकि यह पता नहीं चलता कि यह दौड़ जाएगा या नहीं)। फिर भी, ऐसा नहीं लगता कि एक स्थिर विधि का उपयोग करने के योग्य है, क्योंकि 'foo' अभी भी एक उदाहरण माना जाता है; एक शून्य उदाहरण, लेकिन फिर भी एक उदाहरण।

+3

एक्सटेंशन विधियां पहले से ही स्थिर हैं। एक्सटेंशन विधियों का उपयोग करने के तरीके में विधि को स्थिर करने की आवश्यकता कैसे होती है? –

+3

"मुझे' AssignDel' स्थिर बनाने की आवश्यकता है "। फिर इसे स्थिर बनाओ। –

+1

@ किर्क: हालांकि विस्तार विधियों को स्थैतिक तरीकों के रूप में परिभाषित किया गया है, लेकिन उन्हें केवल इच्छित वर्ग के उदाहरण विधियों के रूप में उपयोग किया जा सकता है। –

उत्तर

0

मैं क्या मैं सिर्फ विरासत श्रृंखला में एक अन्य स्तर पर लागू करने के लिए आवश्यक करने के लिए कामयाब रहे।

public class Foo 
{  
    public string Property1 { get; set; } 
} 

public class Foo<T> : Foo 
{ 
    public static void AssignDel<TVal>(Expression<Func<T, TVal>> expr, Action<T, TVal> action) 
    { } 
} 

public class InheritsFoo : Foo<InheritsFoo> 
{  } 

मैं इनहेरिट्सफू का इलाज कर सकता हूं जैसा कि मुझे चाहिए।

1

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

यह समझ के एक महान सौदा नहीं है।

InheritsFoo.AssignDel एक स्थिर विधि है।

आपने InheritsFoo.AssignDel<InheritsFoo, string>(x => x.Property1, handler); करके स्थिर विधि कहा है, यह आपकी आवश्यकताओं को पूरा करता है।

मुझे नहीं पता कि दूसरे विकल्प के साथ क्या गलत है। यह वही करता है जो आपको करने की ज़रूरत है, यह स्पष्ट है कि क्या हो रहा है, क्या यह वास्तव में है क्योंकि आप InheritsFoo और stringfoo.AssignDel(x => x.Property1, handler); के बजाय पास करते हैं?

ऐसा लगता है कि आप बस निम्न कार्य कर सकते हैं और जो चाहते हैं उसे प्राप्त कर सकते हैं।

public class Foo 
    { 
     public string Property1 { get; set; } 
    } 

    public class InheritsFoo : Foo 
    { 
     public static void AssignDel<TVal>(
      Expression<Func<InheritsFoo, TVal>> expr, 
      Action<InheritsFoo, TVal> action) 
     { 
     } 
    } 

मैं कुछ याद आ रही किया जाना चाहिए, क्योंकि यह प्रतीत होता है कि आप इसे InheritsFoo.AssignDel(x => x.Property1, handler); जो है आप अपनी ज़रुरत का प्रयोग करेंगे।

+0

जेनेरिक तर्क निर्दिष्ट करना काम करता है, लेकिन विशेष रूप से टीवील प्रकार के तर्क के मामले में अधिक वर्बोज़ पसंद किया जाएगा। यही कारण है कि मैं विकल्पों के लिए पूछ रहा हूँ। – Random

1

विस्तार विधि पहले से ही स्थिर है।

जाना चाहिए तुम्हें विस्तार विधि तरह से इसका इस्तेमाल नहीं करने के लिए है, यह काम करना चाहिए:

InheritsFoo.AssignDel(x => x.Property1, handler); 

उसी तरह संकलक विस्तार विधि फार्म के लिए प्रकार पैरामीटर infere जाएगा, यह वर्ष के लिए -फैशन स्थिर तरीका।

आप दो प्रकार paremeters साथ विधि की आवश्यकता है, तो आप इस के लिए एक सामान्य वर्ग बना सकते हैं:

public class Foo<T> where T : Foo { 

    public void AssignDel<TVal>(Expression<Func<T, TVal>> expr, Action<T, TVal> action) 
    { 
     //... 
    } 
} 

इस मामले में, तुम कर सकते हो:

Foo<InheritFoo>.AssignDel(x => x.PropertyFromInheritFoo, handler); 

आप कर सकते हैं के रूप में देखें, आपको केवल एक प्रकार का पैरामीटर घोषित करना होगा, दूसरा एक इनकार किया जा रहा है।

आशा है कि यह मदद करता है

+0

यह काम करेगा अगर मैं इनहेरिट्सफू में विधि रखता हूं, जब मैं इसे बेस फू क्लास में ले जाना चाहता हूं। – Random

+0

ओह! मुझे आपकी समस्या का सामना करना पड़ रहा है। ऐसा लगता है कि आप स्क्रू हैं :( – ivowiblo

+0

तो ... मुझे यह समझने दो कि क्या मैं समझ गया हूं: आप फू क्लास में विधि चाहते हैं और सभी पदानुक्रमों के लिए गुण स्वीकार करना चाहते हैं? – ivowiblo

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