2012-10-13 58 views
2
创建实例

假设我们有一些类使用催化剂

class Class1{ } 
class Class2{ } 
class Class3{ } 

,我有一个类型变量

Type t = /*some type unknown at compile-time*/; 

变量t为1类或类2或Class3中。我想创建该类的一个实例。据我所知,我可以使用以下语句:

object instance = Activator.CreateInstance(t); 

但我收到一个对象。问题是:如何将此对象转换为变量t。或者有人可以建议一种解决方法。 感谢

回答

3

除非有一些共同的基类或接口,所有3股,你不能 - 你可以把它叫做是“对象” 。考虑让他们全部实现一个接口,然后转向它。

5

如果你想避免反射,然后

public interface IClass { } 
class Class1 : IClass { } 
class Class2 : IClass { } 
class Class3 : IClass { } 

IClass instance = (IClass)Activator.CreateInstance(t); 
2

您可以使用关键字dynamic

dynamic instance = Activator.CreateInstance(t); 

这就像如果你使用object,但在这种情况下,类型仅在运行时已知的,所以直到你没有运行您的程序它支持一切。 处理反射是很常见的。

欲了解更多信息look here

1

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是1类或类2或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) 
{ 
    //... 
} 

那么它的工作原理,以及里面的每个可以使用不管它是什么appropiate该类类的方法。

“这不是非常通用的” - 你说 - “我不想在每次新课程出现时写一个新方法!”。我同意,你可以解决进入Reflection部门的问题。但是,老实说,这是毫无意义的。正如你已经被告知这些课程没有共同之处,所以你最好是creating an interface to avoid Reflection

另外,你想用这个对象做什么?有机会,你可以找到所有类通用的方法,并使用相关类从现在开始实现的新界面中的方法。好的,我知道在撰写本文的时候已经有了一个可以接受的答案,但我仍想指出:是的,你可以。 (每次我找到有人说你不能做某事,我喜欢检查:P)。

+0

谢谢你的回答。事实上,我有很多分类(30-50),所以在这一点上编写开关盒对我来说不是一个好主意。通过创建一个公共基类来找到解决方案。 – steavy