मुझे लगता है जवाब नहीं है, लेकिन मैं जानना चाहता हूँ अगर यह कुछ इस तरह करने के लिए संभव है:क्या सी # जेनेरिक विधि प्रकार पैरामीटर को "क्लास 'टाइप पैरामीटर के" असाइन करने योग्य "के रूप में बाध्य करना संभव है?
public class MyGenericClass<TSomeClass> {
public void MyGenericMethod<TSomeInterface>()
// This doesn't compile.
where TSomeClass : TSomeInterface
{
//...
}
}
क्या मैं ऊपर (गैर काम कर रहे) उदाहरण में इंगित करने के लिए इसका मतलब यह TSomeInterface
ऐसे विवश करने के लिए है कि यह MyGenericClass
का अंतर्निहित रूपांतरण हो सकता है कि यह किसी भी बेस क्लास, कार्यान्वित इंटरफेस, या (यदि आप वास्तव में फैंसी प्राप्त करना चाहते हैं) हो सकता है।
नोट: मुझे लगता है कारण है कि इस सी # में लागू नहीं किया गया है कि है कि जेनेरिक की कमी नहीं हैं वास्तव में कोड अनुबंध, जो कि कैसे मैं उन्हें यहाँ का उपयोग करने के कोशिश कर रहा हूँ होना। मुझे वास्तव में परवाह नहीं है कि TSomeInterface
किस प्रकार है, जब तक इसे TSomeClass
द्वारा कार्यान्वित किया जाता है।
अब तक, मैं इस एक साथ हैक कर लिया है:
public class MyGenericClass<TSomeClass> {
public void MyGenericMethod<TIntermediateType, TSomeInterface>()
where TIntermediateType : TSomeClass, TSomeInterface
{
//...
}
}
यह कम या ज्यादा बाधा है कि मैं चाहता हूँ (कि TSomeClass
से, या एक अंतरफलक के मामले में, TSomeInterface
में, लागू वारिस चाहिए) को लागू करता है, लेकिन यह बुला बहुत अनाड़ी है, क्योंकि मैं TIntermediateType
निर्दिष्ट करने के लिए (भले ही मैं वास्तव में यह TSomeClass
के खिलाफ मूल्यांकन करना चाहते हैं) है:
var myGenericInstance = new MyGenericClass<TSomeClass>();
myGenericInstance.MyGenericMethod(TSomeClass, TSomeInterface);
साथ ही, इसके बाद के संस्करण हैक क्योंकि एक फोन करने वाले में कर सकता है टूट गया है ऑरी TSomeClass
का उप-वर्ग निर्दिष्ट प्रकार पैरामीटर के रूप में निर्दिष्ट करें, जहां केवल उप-वर्ग TSomeInterface
लागू करता है।
कारण यह है कि मैं इस क्या करना चाहते हैं कि मैं एक WCF सेवा के लिए एक धाराप्रवाह कारखाने पैटर्न लिख रहा हूँ है, और मैं साथ कि समाप्ति बिंदु बनाने का प्रयास कर से (संकलन समय पर) फोन करने वाले को रोकने के लिए की तरह होगा एक अनुबंध जो सेवा वर्ग लागू नहीं करता है। मैं इसे रनटाइम पर देख सकता हूं (वास्तव में डब्ल्यूसीएफ वास्तव में मेरे लिए यह करता है), लेकिन मैं संकलन-समय की जांच का एक बड़ा प्रशंसक हूं।
क्या मैं यहां प्राप्त करने के लिए एक बेहतर/अधिक सुरुचिपूर्ण तरीका है?
पर विचार के लिए इस कार्यक्रम को संकलित करता है:
class Program {
class Class1 { }
class Class2 { }
public class MyGenericClass<TSomeClass> {
public void MyGenericMethod<TSomeInterface>() where TSomeClass : TSomeInterface {
}
}
static void Main(string[] args) {
var inst = new MyGenericClass<Class1>();
}
}
सब कुछ अच्छा है
यह व्यावहारिक रूप से असंभव है क्योंकि आप जेनिक्स को रनटाइम के साथ मिश्रित करने की कोशिश कर रहे हैं। – Polity
नहीं, मैं नहीं हूं। मैं बस एक सामान्य बाधा लागू करने की कोशिश कर रहा हूं (जहां तक मैं कह सकता हूं) सी # भाषा अनुमति नहीं देता है (एक प्रकार पैरामीटर को बाधित करता है जैसे कि यह एक श्रेणी के पैरामीटर में एक प्रकार के पैरामीटर का सुपरक्लास या कार्यान्वित इंटरफ़ेस है)। –
जहां तक मैं इसे देखता हूं, आप क्लास जेनेरिक को उस विधि के आधार पर बाध्य करने का प्रयास करते हैं जिसे आप किसी विधि को खिलाते हैं।यदि आप अपनी कक्षा जेनेरिक को बाधित करना चाहते हैं तो आपको कक्षा स्तर (तर्कसंगत) पर ऐसा करने की आवश्यकता है अन्यथा जेआईटी कंपाइलर को ठोस वर्ग बनाने का कोई तरीका नहीं है। – Polity