有人告诉你你不能,但你可以。
首先让我们看看你的代码:
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)
{
//...
}
它工作得很好,并且在每个类的方法中,您可以使用适合该类的任何内容。
“它不是很通用” - 你说 - “我不想每次出现新类时都编写新方法!”。我同意,你可以在反射部门解决这个问题。但是,老实说,这是没有意义的。正如您已经被告知的那样,这些类没有任何共同点,因此您最好创建一个接口来避免 Reflection。
另外,你想用那个对象做什么?您可能会找到所有类共有的方法,并在相关类将从现在开始实现的新接口中使用这些方法。
好的,我知道在撰写本文时已经有一个公认的答案,但我还是想指出:是的,你可以。(每次我发现有人说你不能做某事时,我喜欢做双重检查:P)。