Type type = typeof(ObjectComparer<>).MakeGenericType(pType); object obj = Activator.CreateInstance(type);
However, unless you cast to a non-generic interface (IComparer, maybe), you lose the ability to use it as a generic type.
The most common answer here is a non-generic base class/interface:
interface ISomeInterface { object SomeMethod(object value); } interface ISomeInterface<T> : ISomeInterface { T SomeMethod(T value); }
You can then invoke via the non-generic ISomeInterface without having to jump through any extra hoops.
Example using MakeGenericMethod below - but a non-generic base interface would more efficient:
class Program { static void Main() { int i = 123; typeof(Program).GetMethod("Foo", BindingFlags.Static | BindingFlags.NonPublic) .MakeGenericMethod(i.GetType()) .Invoke(null, new object[] { i }); } static void Foo<T>(T value) { ObjectComparer<T> comparer = new ObjectComparer<T>(); comparer.Bar(value); } } class ObjectComparer<T> { public void Bar(T value) { Console.WriteLine(typeof(T).Name + " = " + value); } }