我有某个对象的System.Type但是需要将它作为Type Parameter T传递给另一个方法......是否有可能?或者我在那里失去了更大的影响?
答案 0 :(得分:1)
这是不可能的。如果考虑一下,在编译时解析Type参数,而在运行时通过反射解析System.Type。
现在,说过这是不可能的,可以通过反射来实现。如果使用反射创建类,则可以将System.Type作为参数传递,但可能只需要重新设计您正在尝试的任何内容。
编辑:这是重新设计的一些想法。
System.Type来自哪里?你可以把它作为一个类型参数传递给它,以便它可以传递吗?
如果没有,您是否可以制作一个处理已使用的已知类型的适配器?也许是一个switch语句,它从System.Type转换为正确的泛型调用?任何事情都比反思更快。
答案 1 :(得分:1)
您要求做的事情在.Net中是不可能的。类型参数是.Net(C#和VB)中的编译类型操作。 System.Type实例虽然是运行时构造。有关System.Type背后的实际类型的任何查询都必须在运行时进行。因此,解决方案不兼容。
例如:
public void DoSomething<T>(T value) {
// Do something with a value of type T
}
public Example1() {
DoSomething(42); // Calls DoSomething<int>
Type t1 = typeof(int);
DoSomething(t1); // Calls DoSomething<Type>
object o1 = 42;
Type t2 = o1.GetType();
DoSomething(???) // No way to call DoSomething<int> here without some
// wild reflection because the call to DoSomething is
// established at compile type where t2 is established
// at runtime
}
答案 2 :(得分:0)
您可以使用反射来完成此操作。
您不想改变您的设计(避免反射)吗?所以你可以将你的类型作为参数传递:
DoSomething(yourObject.GetTaype());
答案 3 :(得分:0)
考虑使用替代设计。通用类型旨在在编译时静态解析。
尽管如此,还是可以的。你需要求助于反思:
public class TypeReporter<T> {
public TypeReporter() {
Console.WriteLine("this type is: {0}", typeof(T));
}
// other methods
}
public class StackOverflow694683 {
static void Main() {
string n = "..."; // Pick a type, such as System.String.
Type arg = Type.GetType(n);
Type genericClass = typeof(TypeReporter<>);
Type createdClass = genericClass.MakeGenericType(arg);
// Result is of TypeReporter<T> type. Invoke desired methods.
object result = Activator.CreateInstance(createdClass);
}
}
答案 4 :(得分:0)
您通常做的是为通用方法专门为这些操作设置重载。 E.g:
Load<T>();
Load(Type type);