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