यदि कोई ऑब्जेक्ट C # में दिए गए इंटरफ़ेस को लागू करता है, तो परीक्षण का सबसे सरल तरीका क्या है? ( जावा में इस सवाल का जवाब )
यदि कोई ऑब्जेक्ट C # में दिए गए इंटरफ़ेस को लागू करता है, तो परीक्षण का सबसे सरल तरीका क्या है? ( जावा में इस सवाल का जवाब )
जवाबों:
if (object is IBlah)
या
IBlah myTest = originalObject as IBlah
if (myTest != null)
if (object is IBlah iblah) { iblah.SomeMethod(); }
is
या as
ऑपरेटर्स का उपयोग करना सही तरीका है यदि आप संकलन समय पर इंटरफ़ेस प्रकार जानते हैं और आपके द्वारा परीक्षण किए जा रहे प्रकार का उदाहरण है। कुछ है कि और कोई नहीं उल्लेख किया है लगता है Type.IsAssignableFrom
:
if( typeof(IMyInterface).IsAssignableFrom(someOtherType) )
{
}
मुझे लगता है कि इसके द्वारा लौटाई गई सरणी के माध्यम से देखने की तुलना में यह बहुत अच्छा है GetInterfaces
और कक्षाओं के लिए भी काम करने का फायदा है।
typeof(IList).IsAssignableFrom(someType)
, बिना <>
।
उदाहरण के लिए:
if (obj is IMyInterface) {}
वर्ग के लिए:
जाँचें कि क्या typeof(MyClass).GetInterfaces()
इंटरफ़ेस शामिल है।
यदि आप जांच के बाद टाइप किए गए ऑब्जेक्ट का उपयोग करना चाहते हैं:
C # 7.0 के बाद से:
if (obj is IMyInterface myObj)
यह भी ऐसा ही है
IMyInterface myObj = obj as IMyInterface;
if (myObj != null)
.NET डॉक्स देखें: # टाइप पैटर्न के साथ पैटर्न का मिलानis
@ एंड्रयूकेनन के उत्तर पर एक भिन्नता जो मैंने हाल ही में रनटाइम पर प्राप्त किए गए प्रकारों का उपयोग करके समाप्त की:
if (serviceType.IsInstanceOfType(service))
{
// 'service' does implement the 'serviceType' type
}
"है" ऑपरेटर का उपयोग करके परीक्षण के अलावा, आप यह सुनिश्चित करने के लिए अपने तरीकों को सजा सकते हैं कि चर इसे करने के लिए पारित एक विशेष इंटरफ़ेस को लागू करते हैं, जैसे:
public static void BubbleSort<T>(ref IList<T> unsorted_list) where T : IComparable
{
//Some bubbly sorting
}
मुझे यकीन नहीं है कि .Net का कौन सा संस्करण इसे लागू किया गया था ताकि यह आपके संस्करण में काम न करे।
मेरे लिए क्या काम किया है:
Assert.IsNotNull(typeof (YourClass).GetInterfaces().SingleOrDefault(i => i == typeof (ISomeInterface)));
हाल ही में मैंने एंड्रयू केनन के उत्तर का उपयोग करने की कोशिश की और यह मेरे लिए किसी कारण से काम नहीं आया। मैंने इसके बजाय इसका इस्तेमाल किया और इसने काम किया (ध्यान दें: नाम लिखना आवश्यक हो सकता है)।
if (typeof(someObject).GetInterface("MyNamespace.IMyInterface") != null)
मेरे पास एक ऐसी स्थिति थी जहां मैं एक चर को एक विधि में पारित कर रहा था और यह सुनिश्चित नहीं था कि यह एक इंटरफ़ेस या ऑब्जेक्ट होने जा रहा था।
लक्ष्य थे:
मैंने इसे निम्नलिखित के साथ हासिल किया:
if(!typeof(T).IsClass)
{
// If your constructor needs arguments...
object[] args = new object[] { my_constructor_param };
return (T)Activator.CreateInstance(typeof(T), args, null);
}
else
return default(T);
यह काम करना चाहिए:
MyInstace.GetType().GetInterfaces();
लेकिन अच्छा भी:
if (obj is IMyInterface)
या यहां तक कि (बहुत सुंदर नहीं):
if (obj.GetType() == typeof(IMyInterface))