दिलचस्प पोस्ट
रेल के 3 रूपों के लिए रूबी में _nownowman param क्या है? संदर्भ गिरने के नियमों का संक्षिप्त विवरण अनुरोध किया गया: (1) ए और & -> ए और, (2) ए और && -> ए और, (3) ए && & -> ए और, और (4) ए एंडएण्ड -> ए एंड ए @ नवीनतम एनोटेशन उपयोग PHP सत्र डिफ़ॉल्ट समयबाह्य वीडियो दृश्य प्राप्त करेंड्राइंग कैच काला लौट रहा है मैं JavaFX में प्रगति बार घटक कैसे शैली कर सकता हूं उपप्रक्रिया संवाद (')' के साथ 'हाँ' रिपोर्टिंग त्रुटि बराबर के साथ स्ट्रिंगबफर सामग्री की तुलना करना घूर्णन बिटमैप कोड में एंड्रॉइड में फेसबुक एंड्रॉइड एसडीके के साथ फेसबुक पर फोटो अपलोड करें जावा कन्वर्ट करने के लिए लंबे समय से? स्विफ्ट में वापस बटन पाठ को कैसे सेट करें उल्का: सर्वर साइड पर डीबग कंस्ट्रक्टर को कोई कॉल क्यों नहीं है? प्रिंट करने योग्य ट्विटर-बूटस्ट्रैप पृष्ठ कैसे बनाएं

एक सामान्य प्रकार पैरामीटर पर एक स्थिर विधि कॉलिंग

मैं ऐसा कुछ करने की उम्मीद कर रहा था, लेकिन यह सी # में अवैध प्रतीत होता है:

public Collection MethodThatFetchesSomething<T>() where T : SomeBaseClass { return T.StaticMethodOnSomeBaseClassThatReturnsCollection(); } 

मुझे एक संकलन-समय त्रुटि मिलती है: "टी 'एक' प्रकार पैरामीटर 'है, जो संदर्भ में मान्य नहीं है।"

एक सामान्य प्रकार पैरामीटर को देखते हुए, मैं सामान्य वर्ग पर एक स्थिर विधि कैसे कॉल कर सकता हूँ? स्थैतिक विधि को उपलब्ध होना चाहिए, बाधा को देखते हुए।

वेब के समाधान से एकत्रित समाधान "एक सामान्य प्रकार पैरामीटर पर एक स्थिर विधि कॉलिंग"

इस मामले में आपको केवल प्रतिबंधित विधि पर सीधे तरीके से कॉल करना चाहिए सी # (और सीएलआर) वर्चुअल स्थैतिक तरीकों का समर्थन नहीं करते हैं। तो T.StaticMethodOnSomeBaseClassThatReturnsCollection SomeBaseClass.StaticMethodOnSomeBaseClassThatReturnsCollection से कोई भिन्न नहीं हो सकता है। जेनेरिक प्रकार पैरामीटर के माध्यम से जाना एक अनावश्यक अवरोधन है और इसलिए समर्थित नहीं है।

पिछले उत्तर पर विस्तार करने के लिए, मुझे लगता है कि प्रतिबिंब उस चीज़ के करीब है जो आप यहां चाहते हैं। मैं 1001 कारण दे सकता हूं कि आपको कुछ क्यों नहीं करना चाहिए या नहीं, मैं आपके सवाल का जवाब सिर्फ पूछता हूं। मुझे लगता है कि आपको सामान्य पैरामीटर के प्रकार पर GetMethod विधि को कॉल करना चाहिए और वहां से जाएं। उदाहरण के लिए, किसी फ़ंक्शन के लिए:

 public void doSomething<T>() where T : someParent { List<T> items=(List<T>)typeof(T).GetMethod("fetchAll").Invoke(null,new object[]{}); //do something with items } 

जहां टी किसी भी वर्ग है जिसमें स्थिर विधि लाने के लिए सभी ()

हां, मुझे पता है कि यह भयावह धीमा है और यदि दुर्घटना हो सकती है तो कुछ माता-पिता अपनी सभी कक्षाओं को फेक को लागू करने के लिए मजबूर नहीं करता है, लेकिन यह पूछे जाने वाले प्रश्न का उत्तर देता है।

ऐसी विधि को बुलाए जाने का एकमात्र तरीका प्रतिबिंब के माध्यम से होगा, हालांकि, ऐसा लगता है कि यह एक इंटरफ़ेस में उस कार्यक्षमता को लपेट करना संभव हो सकता है और उदाहरण-आधारित IoC / factory / etc पैटर्न का उपयोग कर सकता है।

ऐसा लगता है कि आप जेनेरिक को इस तथ्य के आसपास काम करने का प्रयास कर रहे हैं कि सी # में "वर्चुअल स्टैटिक तरीके" नहीं हैं

दुर्भाग्य से, यह काम करने वाला नहीं है

यहां, मैं एक उदाहरण पोस्ट करता हूं जो काम करती है, यह एक वैकल्पिक हल है

 public interface eInterface { void MethodOnSomeBaseClassThatReturnsCollection(); } public T:SomeBaseClass, eInterface { public void MethodOnSomeBaseClassThatReturnsCollection() { StaticMethodOnSomeBaseClassThatReturnsCollection() } } public Collection MethodThatFetchesSomething<T>() where T : SomeBaseClass, eInterface { return ((eInterface)(new T()).StaticMethodOnSomeBaseClassThatReturnsCollection(); } 

अब तक, आप नहीं कर सकते आपको संकलक को कहने का एक तरीका चाहिए कि टी उस पद्धति की है, और वर्तमान में, ऐसा करने का कोई तरीका नहीं है। (बहुत से माइक्रोसॉफ्ट को एक सामान्य बाधा में निर्दिष्ट किया जा सकता है विस्तार करने के लिए प्रेरित कर रहे हैं, इसलिए शायद यह भविष्य में संभव होगा)।

आप इसे प्रतिबिंब का उपयोग करने में सक्षम होना चाहिए, जैसा कि यहां वर्णित है

मैं सिर्फ इसे बाहर फेंकना चाहता था, कभी-कभी प्रतिभागियों ने संदर्भों के आधार पर इन समस्याओं का समाधान किया।

अगर आपको किसी प्रकार की फैक्ट्री या आरंभीकरण पद्धति के रूप में स्थिर विधि पर कॉल करने की आवश्यकता है, तो आप एक प्रतिनिधि को घोषित कर सकते हैं और प्रासंगिक सामान्य कारखाने के लिए स्थैतिक पद्धति को पास कर सकते हैं या जो कुछ भी है वह "इस स्थिर विधि के साथ सामान्य वर्ग" की आवश्यकता है।

उदाहरण के लिए:

 class Factory<TProduct> where TProduct : new() { public delegate void ProductInitializationMethod(TProduct newProduct); private ProductInitializationMethod m_ProductInitializationMethod; public Factory(ProductInitializationMethod p_ProductInitializationMethod) { m_ProductInitializationMethod = p_ProductInitializationMethod; } public TProduct CreateProduct() { var prod = new TProduct(); m_ProductInitializationMethod(prod); return prod; } } class ProductA { public static void InitializeProduct(ProductA newProduct) { // .. Do something with a new ProductA } } class ProductB { public static void InitializeProduct(ProductB newProduct) { // .. Do something with a new ProductA } } class GenericAndDelegateTest { public static void Main() { var factoryA = new Factory<ProductA>(ProductA.InitializeProduct); var factoryB = new Factory<ProductB>(ProductB.InitializeProduct); ProductA prodA = factoryA.CreateProduct(); ProductB prodB = factoryB.CreateProduct(); } } 

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

इस दृष्टिकोण में कुछ लाभ भी हैं, यानी आप init विधियों का पुन: उपयोग कर सकते हैं, उन्हें उदाहरण के तरीकों, आदि।