如果我将用户定义对象的类名作为字符串,如何在泛型函数中将其用作对象的类型?
SomeGenericFunction(的objectID);
答案 0 :(得分:5)
如果您有字符串,那么首先要做的是使用Type.GetType(string)
或(最好)Assembly.GetType(string)
来获取Type
实例。从那里,你需要使用反射:
Type type = someAssembly.GetType(typeName);
typeof(TypeWithTheMethod).GetMethod("SomeGenericFunction")
.MakeGenericMethod(type).Invoke({target}, new object[] {objectID});
其中{target}
是实例方法的实例,null
是静态方法的实例。
例如:
using System;
namespace SomeNamespace {
class Foo { }
}
static class Program {
static void Main() {
string typeName = "SomeNamespace.Foo";
int id = 123;
Type type = typeof(Program).Assembly.GetType(typeName);
object obj = typeof(Program).GetMethod("SomeGenericFunction")
.MakeGenericMethod(type).Invoke(
null, new object[] { id });
Console.WriteLine(obj);
}
public static T SomeGenericFunction<T>(int id) where T : new() {
Console.WriteLine("Find {0} id = {1}", typeof(T).Name, id);
return new T();
}
}
答案 1 :(得分:0)
查看System.Type.GetType()方法 - 提供完全限定的类型名称,然后返回相应的Type对象。然后你可以这样做:
namespace GenericBind {
class Program {
static void Main(string[] args) {
Type t = Type.GetType("GenericBind.B");
MethodInfo genericMethod = typeof(Program).GetMethod("Method");
MethodInfo constructedMethod = genericMethod.MakeGenericMethod(t);
Console.WriteLine((string)constructedMethod.Invoke(null, new object[] {new B() }));
Console.ReadKey();
}
public static string Method<T>(T obj) {
return obj.ToString();
}
}
public class B {
public override string ToString() {
return "Generic method called on " + GetType().ToString();
}
}
}