Since it modelTypeis just an instance Type, you cannot do this automatically, since there is no universal API. Various options:
1: use reflection, for example (untested)
object builder = Activator.CreateInstance(...);
var model=builder.GetType().GetMethod("BuildModel").Invoke(builder,null);
2: trick using dynamic:
dynamic builder = Activator.CreateInstance(...);
var model = builder.BuildModel();
3: IModelBuilder
, 1 2 ( ) . "1" :
var model = typeof(IModelBuilder<>).MakeGenericType(modelType)
.GetMethod("BuildModel").Invoke(builder);
- , . dynamic:
interface ISneaky<T>
{
T Foo { get; }
}
class Sneaky<T> : ISneaky<T>
{
T ISneaky<T>.Foo { get { return default(T); } }
}
class Program
{
static void Main()
{
Execute(typeof(int));
}
static void Execute(Type t)
{
dynamic obj = Activator.CreateInstance(
typeof(Sneaky<>).MakeGenericType(t));
Evil(obj);
}
static void Evil<T>(ISneaky<T> sneaky)
{
Console.WriteLine("{0}: {1}", typeof(T).Name, sneaky.Foo);
}
}