我有一个通用的类
public class MyClass<T>
{
public List<T> Translate(List<T> list, params string[] names)
{
//do something here,modify list and return list
}
}
现在我可以轻松创建像
这样的实例MyClass<Employee> obj= new MyClass<Employee>(); OR
MyClass<Vehicle> obj = new MyClass<Vehicle>();
我可以像
一样调用我的方法 obj.Translate(Mylist of employee or vehicle type,"param1","param2")
但在我的情况下,我不知道在运行时生成的类型T,请参阅下面的代码
String classname = string.Empty;
if(Classtype == 1)
{
classname = "Employee"
}
else if(classtype == 2)
{
classname = "Vehicle"
}
我想要下面的东西......所以我可以创建这个泛型类的实例
MyClass<typeof(classname)> empp = new MyClass<typeof(classname)>();
empp.Translate(MyList,"param1","param2")
请建议,我该怎么做。
答案 0 :(得分:7)
尝试
var someType = Type.GetType("MyProject.Employee");
var yourGenericType = typeof(MyClass<>).MakeGenericType(new [] { someType });
var instance = Activator.CreateInstance(yourGenericType);
请注意,Type.GetType(...)仅适用于类型的完整命名空间,如果您的类与执行此操作的代码不在同一个dll中,则甚至可以使用完整的程序集限定名称。
答案 1 :(得分:0)
感谢所有帮助我能够通过这种方式实现
var someType = Type.GetType("MyProject.Employee");
var genericType = typeof(Convert<>).MakeGenericType(new[] { someType });
var instance = Activator.CreateInstance(genericType);
string instanceType = instance.GetType().FullName;
MethodInfo methodInfo = Type.GetType(instanceType).GetMethod("Translate");
genericType.InvokeMember(methodInfo.Name, BindingFlags.InvokeMethod | BindingFlags.Public | BindingFlags.Instance, null, instance, new object[] { lstEmp, "Name", "City" });
依禅
答案 2 :(得分:0)
public T CreateEmptyObject<T>()
{
return (T)Activator.CreateInstance(typeof(T));;
}
要打电话:
YourClassObject yourClassObject = CreateEmptyObject<YourClassObject>();