.Net Tips – How to determine if a type implements a generic interface type

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