यदि ऑब्जेक्ट इंटरफ़ेस लागू करता है तो परीक्षण करें


355

यदि कोई ऑब्जेक्ट C # में दिए गए इंटरफ़ेस को लागू करता है, तो परीक्षण का सबसे सरल तरीका क्या है? ( जावा में इस सवाल का जवाब )

जवाबों:


569
if (object is IBlah)

या

IBlah myTest = originalObject as IBlah

if (myTest != null)

85
+1 दूसरा एक बेहतर है क्योंकि आप शायद पहले वाले के साथ बाद में कास्ट करने की आवश्यकता को समाप्त कर देंगे, इस प्रकार आपको दो कास्ट ("और फिर एक स्पष्ट कास्ट) देनी होगी।" दूसरे दृष्टिकोण के साथ आप केवल एक बार कास्ट करते हैं।
एंड्रयू हरे

51
@Andrew: +1; जूलियन एम बकनेल द्वारा क्लासिक डबल-कास्टिंग एंटीपैटर्न ब्लॉग पोस्ट के लिंक के लिए फिर से समय ।
जीरोन विर्ट प्लिमर्स

1
अनुकूलन शायद आपने पहले मामले में दो बार नहीं डाला होगा?
Buzz

1
@Joreen, वह लिंक एक बिंदु से चूक जाता है यदि आप एक ऐसी संरचना के साथ काम कर रहे हैं जिसका उपयोग आप "के रूप में" नहीं कर सकते हैं क्योंकि यह एक अशक्त नहीं है जो कि "जैसा कि" लौटने की कोशिश करता है, उस स्थिति में आपको एक अशक्त से गुजरना पड़ता है int जैसे वर्ग ?, हालांकि एक मुद्दा नहीं है अगर आपके केवल इंटरफ़ेस स्तर पर काम कर रहे हैं क्योंकि वे हमेशा संदर्भ प्रकार होते हैं
माइक

46
चूंकि C # 6.0:if (object is IBlah iblah) { iblah.SomeMethod(); }
कैलिस

224

isया asऑपरेटर्स का उपयोग करना सही तरीका है यदि आप संकलन समय पर इंटरफ़ेस प्रकार जानते हैं और आपके द्वारा परीक्षण किए जा रहे प्रकार का उदाहरण है। कुछ है कि और कोई नहीं उल्लेख किया है लगता है Type.IsAssignableFrom:

if( typeof(IMyInterface).IsAssignableFrom(someOtherType) )
{
}

मुझे लगता है कि इसके द्वारा लौटाई गई सरणी के माध्यम से देखने की तुलना में यह बहुत अच्छा है GetInterfacesऔर कक्षाओं के लिए भी काम करने का फायदा है।


मैं यह निर्धारित करने की कोशिश कर रहा हूं कि क्या कोई प्रकार IList के कुछ तात्कालिकता को लागू करता है। मैं "टाइपोफ़ (IList <>) का उपयोग कर रहा हूं। IsAssignableFrom (someType)" लेकिन वह काम नहीं कर रहा है।
KeyboardDrummer

3
आप एक और सवाल में यह पूछना बेहतर होगा। यदि कुछ टाइप सूची के तत्वों का प्रकार है, तो आपको टाइपोफ़ (IList <>) की आवश्यकता हो सकती है। MakeGenericType (someType)। यदि कुछ प्रकार सूची है, तो आपको टाइप करना चाहिए।
एंड्रयू केनन

मैं इसे एक प्लगइन सिस्टम में टाइप जाँच के लिए उपयोग करता हूँ। इसका उपयोग उन स्थितियों में किया जा सकता है जहां वस्तु का एक उदाहरण अभी तक मौजूद नहीं है। लेकिन मैं इस शैली और रॉबर्ट दोनों का उपयोग करता हूं यह इस बात पर निर्भर करता है कि मैं क्या कर रहा हूं इसलिए मैंने दोनों तरीकों से मतदान किया।
जेम्स

यह एक पुरानी टिप्पणी है, लेकिन @ Steenreem के प्रश्न का उत्तर देने के लिए, का उपयोग करें typeof(IList).IsAssignableFrom(someType), बिना <>
नमस्कार

यह विधि रूपांतरण ऑपरेटरों के साथ भी काम करती है और यदि TypeConverters शामिल हैं
Harald Coppoolse

22

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

if (obj is IMyInterface) {}

वर्ग के लिए:

जाँचें कि क्या typeof(MyClass).GetInterfaces()इंटरफ़ेस शामिल है।


1
if (Array.IndexOf (टाइपोफ़ (MyClass) .GetInterfaces) (), टाइपोफ़ (IMyInterface))! = -1) {...}
कॉन्स्टेंटिन

2
या: यदि (टाइपोफ़ (MyClass) .गेटइंटरफ़ेसेस ()। इसमें शामिल हैं (टाइपोफ़ (IMyInterface))) {...}
लांस फ़िशर

17

यदि आप जांच के बाद टाइप किए गए ऑब्जेक्ट का उपयोग करना चाहते हैं:
C # 7.0 के बाद से:

if (obj is IMyInterface myObj)

यह भी ऐसा ही है

IMyInterface myObj = obj as IMyInterface;
if (myObj != null)

.NET डॉक्स देखें: # टाइप पैटर्न के साथ पैटर्न का मिलानis


16

@ एंड्रयूकेनन के उत्तर पर एक भिन्नता जो मैंने हाल ही में रनटाइम पर प्राप्त किए गए प्रकारों का उपयोग करके समाप्त की:

if (serviceType.IsInstanceOfType(service))
{
    // 'service' does implement the 'serviceType' type
}

7

यह पोस्ट एक अच्छा जवाब है।

public interface IMyInterface {}

public class MyType : IMyInterface {}

यह एक सरल नमूना है:

typeof(IMyInterface).IsAssignableFrom(typeof(MyType))

या

typeof(MyType).GetInterfaces().Contains(typeof(IMyInterface))

3

"है" ऑपरेटर का उपयोग करके परीक्षण के अलावा, आप यह सुनिश्चित करने के लिए अपने तरीकों को सजा सकते हैं कि चर इसे करने के लिए पारित एक विशेष इंटरफ़ेस को लागू करते हैं, जैसे:

public static void BubbleSort<T>(ref IList<T> unsorted_list) where T : IComparable
{
     //Some bubbly sorting
}

मुझे यकीन नहीं है कि .Net का कौन सा संस्करण इसे लागू किया गया था ताकि यह आपके संस्करण में काम न करे।


2
.net 2.0 ने जेनरिक जोड़ा।
रॉबर्ट सी। बार्थ

यह वह जगह है केवल संकलन समय इस सूत्र में जांच, धन्यवाद।
डस्टिन मेलोन

2

मेरे लिए क्या काम किया है:

Assert.IsNotNull(typeof (YourClass).GetInterfaces().SingleOrDefault(i => i == typeof (ISomeInterface)));


1

हाल ही में मैंने एंड्रयू केनन के उत्तर का उपयोग करने की कोशिश की और यह मेरे लिए किसी कारण से काम नहीं आया। मैंने इसके बजाय इसका इस्तेमाल किया और इसने काम किया (ध्यान दें: नाम लिखना आवश्यक हो सकता है)।

if (typeof(someObject).GetInterface("MyNamespace.IMyInterface") != null)

2
यदि आप इस मार्ग को समाप्त करते हैं, तो मैं जादू के तार का प्रशंसक नहीं हूं, इसलिए मैं "MyNamespace.IMyInterface" के बजाय टाइपऑफ़ (IMyInterface) .Name में कम से कम यह परिवर्तन करूँगा। एक बोनस के रूप में इसका नाम रिफैक्टिंग प्रूफ बनाने में मदद करता है।
greyalien007

0

मैंनें इस्तेमाल किया

Assert.IsTrue(myObject is ImyInterface);

मेरी इकाई परीक्षण में परीक्षण के लिए जो यह बताता है कि myObject एक वस्तु है जिसने मेरे इंटरफ़ेस ImyInterface को लागू किया है।


-1

मेरे पास एक ऐसी स्थिति थी जहां मैं एक चर को एक विधि में पारित कर रहा था और यह सुनिश्चित नहीं था कि यह एक इंटरफ़ेस या ऑब्जेक्ट होने जा रहा था।

लक्ष्य थे:

  1. यदि आइटम एक इंटरफ़ेस है, तो उस इंटरफ़ेस के आधार पर किसी ऑब्जेक्ट को इंस्ट्रूमेंट करें, जिसमें कंस्ट्रक्टर कॉल में एक पैरामीटर हो।
  2. यदि आइटम एक ऑब्जेक्ट है, तो एक नल को वापस करें क्योंकि मेरे कॉल के लिए constuctor एक इंटरफ़ेस की उम्मीद कर रहा है और मुझे कोड को टैंक में नहीं चाहिए।

मैंने इसे निम्नलिखित के साथ हासिल किया:

    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);

-12

यह काम करना चाहिए:

MyInstace.GetType().GetInterfaces();

लेकिन अच्छा भी:

if (obj is IMyInterface)

या यहां तक ​​कि (बहुत सुंदर नहीं):

if (obj.GetType() == typeof(IMyInterface))

9
टाइपोफ (IMyInterface) के लिए समानता की जाँच हमेशा विफल रहेगी। Downvoted।
जय बज़ुजी

सही। इंटरफ़ेस के कोई उदाहरण नहीं हैं।
रौहोतज़
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.