从实例化的System.Type获取类型参数T?

时间:2009-03-29 14:18:54

标签: .net types type-parameter

我有某个对象的System.Type但是需要将它作为Type Parameter T传递给另一个方法......是否有可能?或者我在那里失去了更大的影响?

5 个答案:

答案 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);