Take a look at Type.GetType(string)
:
string name = GetClassName();
Type klass = Type.GetType("Namespace." + name); // Replace "Namespace." with all the namespaces the classes live in, as the argument to `Type.GetType()` should be a fully-qualified name
if (klass is null)
{
// Class was not found
}
Of course, you also need to create an instance of Generic<klass>
:
Type genericOfKlass = typeof(Generic<>).MakeGenericType(klass);
Then instantiate it:
object instance = Activator.CreateInstance(genericOfKlass);
Then call .DoSomething()
on it:
MethodInfo doSomething = genericOfKlass.GetMethod("DoSomething", BindingFlags.Public | BindingFlags.Instance);
doSomething.Invoke(instance, new object[] { });
As you can see, reflection (this kind of dynamic programming is called reflection) is not easy, but possible in .NET.
Edit: Complete example with request data:
Request request = GetClientRequst();
//container is IContainer of Autofac.
Type requestType = Type.GetType("Namespace." + requestType); // Replace "Namespace." with all the namespaces the classes live in, as the argument to `Type.GetType()` should be a fully-qualified name
Type entityDao = typeof(EntityDao<>).MakeGenericType(requestType);
MethodInfo containerResolve = container.GetType().GetMethod("Resolve");
MethodInfo genericContainerResolve = containerResolve.MakeGenericMethod(entityDao);
object resolveResult = genericContainerResolve.Invoke(container, new object[] { });
MethodInfo create = resolveResult.GetType().GetMethod("Create");
create.Invoke(resolveResult, new object[] { request.Data });
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…