I want the class to have a forced static GetProduct method, so that client code can accept a Type object and safely call this static method after checking that the passed type implements the interface.
You are about to make a call through Reflection, so you have to force the execution through Reflection. The whole point of Reflection is to do work at runtime that the compiler could not verify; if you want to check compilation time, you are using the exact tool. Do not use a tool specifically designed to prevent compile-time checking if this is what you need!
I hope there is a more object oriented way (i.e. using inheritance).
You do this in an object oriented way. Object orientation is a traversal of units of functionality in the form of objects and sending them “messages” (the so-called method calls) that describe what operations you want to perform on them, and those “messages” that are analyzed at the end. (Usually late binding in the form of virtual calls, but late binding by name is also fine.)
Inheritance is a mechanism for sharing code between classes and representing semantic relationships "it's kind of"; why do you think inheritance is relevant to your problem?
source share