Presently sponsored by Serverless Guru: Your guide to cloud excellence, helping you every step of your serverless journey, including team training, pattern development, mass service migrations, architecting, and developing new solutions. Speak to a Guru today.
When you have a generic interface such as:
public interface IInitializable<T> { bool IsInitialized { get; } void Initialize(T initObject); }
It’s easy to check whether a given instance implements the IInitializable interface with a specific T:
public class IntInitializable : IInitializable<int> { public bool IsInitialized { get; private set; } public void Initialize(int initObject) { IsInitialized = true; } } … var intInit = new IntInitializable(); Console.WriteLine(intInit is IInitializable<int>); // outputs TRUE
But what if you want to find out if a type implements the IInitializable interface of an arbitrary T? You won’t be able to simply get away with this:
Console.WriteLine(intInit is IInitializable<>); // doesn't compile
Instead, you can do something like this:
var isIInitializable = intInit.GetType() .GetInterfaces() .Any(i => i.IsGenericType && i.GetGenericTypeDefinition() == typeof(IInitializable<>));
And if you want to find out what T is at runtime:
var t = intInit.GetType() .GetInterfaces() .First(i => i.IsGenericType && i.GetGenericTypeDefinition() == typeof(IInitializable<>)) .GetGenericArguments() .First();