मुझे अपनी बेस क्लास पर स्थिर विधि बनाने की आवश्यकता का सामना करना पड़ रहा है, लेकिन मुझे यह पसंद नहीं है कि मुझे तर्क तर्क घोषित करना है, इसलिए मुझे आश्चर्य है कि मैं इसके बारे में जा रहा हूं सही तरीका।स्थैतिक विधि को परिभाषित करने का बेहतर तरीका
मूल रूप से, मैं प्रतिनिधियों को असाइन कर रहा हूं कि मैं कक्षा पर गुणों के साथ संबद्ध हूं। मैं आसानी से इसलिए की तरह, विरासत में मिला वर्गों पर विधि डाल सकता है:
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' अभी भी एक उदाहरण माना जाता है; एक शून्य उदाहरण, लेकिन फिर भी एक उदाहरण।
एक्सटेंशन विधियां पहले से ही स्थिर हैं। एक्सटेंशन विधियों का उपयोग करने के तरीके में विधि को स्थिर करने की आवश्यकता कैसे होती है? –
"मुझे' AssignDel' स्थिर बनाने की आवश्यकता है "। फिर इसे स्थिर बनाओ। –
@ किर्क: हालांकि विस्तार विधियों को स्थैतिक तरीकों के रूप में परिभाषित किया गया है, लेकिन उन्हें केवल इच्छित वर्ग के उदाहरण विधियों के रूप में उपयोग किया जा सकता है। –