你has been told that you can't,但是,你可以。
首先让我们看看你的代码:
class Class1{ }
class Class2{ }
class Class3{ }
void Main()
{
Type t = /*some type unknown at compile-time*/;
object instance = Activator.CreateInstance(t);
}
还有你的问题:
如何将此对象转换为变量 t 中的类型。
好吧,如果我只看这些信息,那么答案是:你不能,因为变量t 中可能有无限的类型集,事实上,其中一些可能已经被定义在编写此代码之后(它们还不存在)。
嗯 - 似乎是 - 还有一些其他信息:
变量 t 是 Class1 或 Class2 或 Class3
意味着您有一组有限的可能类型,它们可能位于变量 t 中。
考虑到这一点,您可以检查它们,例如:
class Class1{ }
class Class2{ }
class Class3{ }
void Main()
{
var possibleTypes = new Type[]
{
typeof(Class1),
typeof(Class2),
typeof(Class3)
};
Type t = possibleTypes[(new Random()).Next(possibleTypes.Length)];
object instance = Activator.CreateInstance(t);
if (t.Equals(typeof(Class1)))
{
DoSomethingWithClass1(instance as Class1);
}
else if (t.Equals(typeof(Class2)))
{
DoSomethingWithClass2(instance as Class2);
}
else if (t.Equals(typeof(Class3)))
{
DoSomethingWithClass3(instance as Class3);
}
}
void DoSomethingWithClass1(Class1 instance)
{
//...
}
void DoSomethingWithClass2(Class2 instance)
{
//...
}
void DoSomethingWithClass3(Class3 instance)
{
//...
}
它很好用,并且在每个类的方法中,您可以使用适合该类的任何东西。
“它不是很通用”——你说——“我不想每次出现新类时都编写新方法!”。我同意,你可以在反射部门解决这个问题。但是,老实说,这是没有意义的。正如你已经被告知的那样,这些课程没有任何共同点,所以你最好 creating an interface to avoid Reflection。
另外,你想用那个对象做什么?您可能会找到所有类共有的方法,并在相关类将从现在开始实现的新接口中使用这些方法。
好的,我知道在撰写本文时已经有一个公认的答案,但我还是想指出:是的,你可以。 (每次我发现有人说你不能做某事时,我都喜欢做双重检查:P)。