Evaluate the best common type to fit both of types
Your code does not take in account interface covariance and contravariance issues.

Here is the sample code that demonstrates it:

class ObservableOfString : IObservable&lt;string&gt; { /*...*/ }
class ObservableOfObject : IObservable&lt;object&gt; { /*...*/ }
class ObserverOfObject : IObserver&lt;object&gt; { /*...*/ }
class ObserverOfString : IObserver&lt;string&gt; { /*...*/ }
class Program
{

    static void Main(string[] args)
    {
        IObservable&lt;object&gt; observableIsCovariant = new ObservableOfString();
        IObserver&lt;string&gt; observerIsContravariant = new ObserverOfObject();
        Console.WriteLine(typeof(ObservableOfString).FindEqualTypeWith(typeof(ObservableOfObject)) ?? (object)"&lt;NULL&gt;"); // Would it not be more useful to return IObservable&lt;object&gt;?
        Console.WriteLine(typeof(ObserverOfString).FindEqualTypeWith(typeof(ObserverOfObject)) ?? (object)"&lt;NULL&gt;"); // Would it not be more useful to return IObserver&lt;string&gt;?
        Console.ReadLine();
    }
}


The fundamental issue is, as soon as you want to find the "best common interface", you are going to run in an issue, as "best" and "common" are at best dependent on the context. You should clearly identify which use cases you are going to support, in the context of why that method was needed, and write a specific implementation that solves your need.