दिलचस्प पोस्ट
स्थिरता एंटीटी प्रबंधक इंजेक्शन NullPointerException जावा मेमोरी उपयोग की निगरानी कैसे करें? जनरेटेड वैल्यू रणनीतियों के बीच अंतर आइफ्रेम में सामग्री सम्मिलित करें चेतावनी: mysql_num_rows () पैरामीटर 1 को संसाधन होने की उम्मीद है, बुलियन दिया गया है $ नोटेशन का उपयोग करते हुए डेटा फ्रेम स्तंभ का चयन करने के लिए स्ट्रिंग चर का उपयोग कैसे करें सी # के साथ, प्रत्येक शब्द के पहले चरित्र, या पूरे स्ट्रिंग के पहले अक्षर को कैपिटल कैसे करें? स्ट्रिंग, स्ट्रिंगबफर, और स्ट्रिंगबइल्डर अल्पविराम से अलग होने वाली सूची के रूप में MySQL परिणाम JSON को जावा में परिवर्तित करना दृश्य स्टूडियो 2015 के साथ सी # 7 का उपयोग कैसे करें? एंड्रॉइड चेकबॉक्स सूचीदृश्य सभी का चयन करें (निष्क्रिय / सक्षम) संकल्प सी # WinForms के परिवर्तन का पता लगाएं मेरे UITableView के शीर्ष पर यूट्यूब में स्टाइल UITableViewStyleGrouped के साथ क्यों अतिरिक्त पैडिंग है .NET 2.0 मिश्रित मोड विधानसभा को किसी .NET 4.0 प्रोजेक्ट में संदर्भित करने के लिए 'अतिरिक्त कॉन्फ़िगरेशन' क्या आवश्यक है?

यह निर्धारित करने के लिए कि क्या कोई प्रकार C # प्रतिबिंब के साथ एक इंटरफ़ेस लागू करता है

क्या C# में प्रतिबिंब यह निर्धारित करने के लिए एक तरीका प्रदान करता है कि कुछ System.Type टाइप प्रकार मॉडल कुछ अंतरफलक?

 public interface IMyInterface {} public class MyType : IMyInterface {} // should yield 'true' typeof(MyType)./* ????? */MODELS_INTERFACE(IMyInterface); 

वेब के समाधान से एकत्रित समाधान "यह निर्धारित करने के लिए कि क्या कोई प्रकार C # प्रतिबिंब के साथ एक इंटरफ़ेस लागू करता है"

मेरे सिर के ऊपर आपके पास कुछ विकल्प हैं I

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

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

प्रकार का प्रयोग करें।

 typeof(IMyInterface).IsAssignableFrom(typeof(MyType)); 
 typeof(IMyInterface).IsAssignableFrom(someclass.GetType()); 

या

 typeof(IMyInterface).IsAssignableFrom(typeof(MyType)); 
  public static bool ImplementsInterface( this Type type, Type ifaceType ) { Type[] intf = type.GetInterfaces(); for ( int i = 0; i < intf.Length; i++ ) { if ( intf[ i ] == ifaceType ) { return true; } } return false; } 

मुझे लगता है कि यह सही रिलीज है, तीन कारणों से:

1) यह GetInterfaces का उपयोग करता है और नहीं IsAssignable से, IsAssignable के बाद से यह तेज़ हैअब तक कई चेक GetInterfaces कॉल करता है
2) यह स्थानीय सरणी के ऊपर चलती है, इसलिए कोई सीमा जांच नहीं होगी।
3) यह == ऑपरेटर का उपयोग करता है जो कि प्रकार के लिए परिभाषित किया गया है, तो शायद बराबर विधि से अधिक सुरक्षित है (जो कि कॉल शामिल होता है, अंततः उपयोग करेगा)।

जैसा कि कोई अन्य व्यक्ति पहले से उल्लेख कर चुका है: बेंजामिन अप्रैल 22 '13 बजे 22 बजे "

यह सुनिश्चित करना आसान नहीं था कि ध्यान देना और ISAssignableFrom पीछे से तर्क के लिए तर्क प्राप्त करें। मैं अब GetInterfaces के साथ जाना होगा: पी –

ठीक है, एक और रास्ता सिर्फ एक छोटा विस्तार विधि बनाने के लिए है, जो कुछ हद तक, "सबसे सामान्य" सोच के तरीके को पूरा करता है (और सहमति व्यक्त की है कि यह किसी की वरीयताओं पर आधारित "थोड़ा अधिक प्राकृतिक" बनाने के लिए यह बहुत कम व्यक्तिगत पसंद है ):

 public static class TypeHelpers { public static Boolean IsAssignableTo(Type type, Type assignableType) { return assignableType.IsAssignableFrom(type); } } public static class TypeExtensions { public static Boolean IsAssignableTo(this Type type, Type assignableType) { return TypeHelpers.IsAssignableTo(type, assignableType); } } 

और क्यों नहीं थोड़ा अधिक सामान्य (अच्छी तरह से यकीन है कि यह सच है कि दिलचस्प है, अच्छी तरह से मुझे लगता है कि मैं सिर्फ 'सिंटैक्सिंग' चीनी की एक और चुटकी पारित कर रहा हूँ नहीं):

 public static class TypeHelpers { public static Boolean IsAssignableTo(Type type, Type assignableType) { return assignableType.IsAssignableFrom(type); } public static Boolean IsAssignableTo<TAssignable>(Type type) { return TypeHelpers.IsAssignableTo(type, typeof(TAssignable)); } } public static class TypeExtensions { public static Boolean IsAssignableTo(this Type type, Type assignableType) { return TypeHelpers.IsAssignableTo(type, assignableType); } public static Boolean IsAssignableTo<TAssignable>(this Type type) { return TypeHelpers.IsAssignableTo<TAssignable>(type); } } 

मुझे लगता है कि यह बहुत अधिक प्राकृतिक हो सकता है, लेकिन एक बार फिर बस बहुत ही व्यक्तिगत राय की बात है:

 var isTrue = michelleType.IsAssignableTo<IMaBelle>(); 

इष्टतम प्रदर्शन के लिए जेफ का जवाब संशोधित करना (पियरे अरनाद द्वारा प्रदर्शन परीक्षण के लिए धन्यवाद):

 var type = typeof(MyType); var implementsInterface = typeof(IMyInterface).IsAssignableFrom(type) && type.IsClass; 

किसी दिए गए Assembly में इंटरफेस लागू करने वाले सभी प्रकार खोजने के लिए:

 var implementations = typeof(TypeInTargetAssembly).Assembly.GetTypes() .Where(t => typeof(IMyInterface).IsAssignableFrom(t) && t.IsClass); 

मैंने अभी किया:

 public static bool Implements<I>(this Type source) where I : class { return typeof(I).IsAssignableFrom(source); } 

काश मैं कह सकता था कि where I : interface , लेकिन interface एक जेनेरिक पैरामीटर बाधा विकल्प नहीं है। class जितना करीब होता है उतना करीब होता है

उपयोग:

 if(MyType.Implements<IInitializable>()) MyCollection.Initialize(); 

मैंने सिर्फ इतना कहा था कि यह अधिक सहज है। मैं हमेशा IsAssignableFrom मिलता IsAssignableFrom फ्लॉप से।

किस बारे में

 if(MyType as IMyInterface != null) 

?

व्हाट अबाउट

 typeof(IWhatever).GetTypeInfo().IsInterface 

IsAssignableFrom अब TypeInfo करने के लिए ले जाया गया है तो …. typeof (ISMSRequest) .GetTypeInfo ()। IsAssignableFrom (टाइपफ (टी) .GetTypeInfo ())

एक सही जवाब है

 typeof(MyType).GetInterface(nameof(IMyInterface)) != null; 

तथापि,

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

गलत परिणाम लौटा सकते हैं, क्योंकि निम्न कोड स्ट्रिंग और आईसीओन्वेबर्बिल के साथ दिखाता है:

  static void TestIConvertible() { string test = "test"; Type stringType = typeof(string); // or test.GetType(); bool isConvertibleDirect = test is IConvertible; bool isConvertibleTypeAssignable = stringType.IsAssignableFrom(typeof(IConvertible)); bool isConvertibleHasInterface = stringType.GetInterface(nameof(IConvertible)) != null; Console.WriteLine($"isConvertibleDirect: {isConvertibleDirect}"); Console.WriteLine($"isConvertibleTypeAssignable: {isConvertibleTypeAssignable}"); Console.WriteLine($"isConvertibleHasInterface: {isConvertibleHasInterface}"); } 

परिणाम:

  isConvertibleDirect: True isConvertibleTypeAssignable: False isConvertibleHasInterface: True