ध्यान दें कि यदि आपके पास एक सामान्य इंटरफ़ेस है IMyInterface<T>
तो यह हमेशा वापस आएगा false
:
typeof(IMyInterface<>).IsAssignableFrom(typeof(MyType)) /* ALWAYS FALSE */
यह भी काम नहीं करता है:
typeof(MyType).GetInterfaces().Contains(typeof(IMyInterface<>)) /* ALWAYS FALSE */
हालाँकि, यदि यह MyType
लागू होता है IMyInterface<MyType>
और वापस आता है true
:
typeof(IMyInterface<MyType>).IsAssignableFrom(typeof(MyType))
हालाँकि, आप संभावना T
रनटाइम पर प्रकार पैरामीटर पता नहीं होगा । कुछ हद तक घोल है:
typeof(MyType).GetInterfaces()
.Any(x=>x.Name == typeof(IMyInterface<>).Name)
जेफ़ का हल थोड़ा कम हैकी है:
typeof(MyType).GetInterfaces()
.Any(i => i.IsGenericType
&& i.GetGenericTypeDefinition() == typeof(IMyInterface<>));
यहां Type
किसी भी मामले के लिए काम करने की एक विस्तार विधि दी गई है:
public static class TypeExtensions
{
public static bool IsImplementing(this Type type, Type someInterface)
{
return type.GetInterfaces()
.Any(i => i == someInterface
|| i.IsGenericType
&& i.GetGenericTypeDefinition() == someInterface);
}
}
(ध्यान दें कि उपरोक्त लाइनक का उपयोग करता है, जो संभवतः लूप की तुलना में धीमा है।)
आप तब कर सकते हैं:
typeof(MyType).IsImplementing(IMyInterface<>)