使用反射将对象转换为泛型类型对象

3

如果在运行时我不知道T的具体类型,那么我能否使用反射从类型为object的对象转换为MyType<T>的对象?


可以,但是如果类型直到运行时才知道,就无法进行编译。 - vcsjones
3
你能否更明确地说明你的场景是什么? - Ondrej Tucny
5
这没有意义。Casting 是需要编译时类型的编译时操作。需注意,不要改变原来的意思。 - SLaks
只要您将MyType<T>定义为:MyType<T> where T : object,您就不会遇到任何问题,因为T已经为编译器定义,并且任何对象都继承自object。 - aevitas
不行,因为 MyType<object> 和 MyType<string> 之间没有继承关系。你不能将 MyType<string> 赋值给 MyType<object> 变量! - Olivier Jacot-Descombes
2个回答

5
您无法在编译时将类型转换为未知类型。强制转换实际上只是一个编译时构造,因为您需要知道类型才能直接使用它。
但是,如果您的目标是通过反射处理对象,那么情况就不同了。在这种情况下,您可以使用Type.MakeGenericType创建正确的类型以便处理您的对象。
这将允许您使用反射来处理您的对象。

好的,但是你如何通过反射访问对象的成员呢?无论如何,你都需要知道它的类型。强制转换问题仍然存在。 - Olivier Jacot-Descombes
@OlivierJacot-Descombes 你需要了解类的一些信息,但不需要知道其具体类型。只要你知道属性或方法的名称,就可以发现它们的类型并调用它们等。虽然在大多数情况下这没什么用,但在某些时候非常有用。 - Reed Copsey

1
在这种情况下的诀窍是使用一个具有通用方法的非通用类。
public class MyType
{
    public T GetResult<T>() {
    }
}

请注意,这发生在编译时。泛型给予您在编译时创建不同“类型”或“方法”的机会;但泛型并动态的!泛型是类型安全的,而类型安全只能在编译时实现(因为编译器检查类型安全性)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接