2

假设我们有一些类

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

我有一个类型变量

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

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

object instance = Activator.CreateInstance(t);

但我收到一个对象。问题是:我如何将此对象转换为变量中的类型t。或者也许有人可以提出解决方法。谢谢

4

4 回答 4

5

如果你想避免反射,那么

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

IClass instance = (IClass)Activator.CreateInstance(t);
于 2012-10-13T17:36:38.657 回答
3

除非有一些共同的基类或接口,所有 3 共享,你不能 - 你可以称之为“对象”。考虑让它们都实现一个接口,并转换为该接口。

于 2012-10-13T17:37:30.887 回答
2

您可以使用以下dynamic关键字:

dynamic instance = Activator.CreateInstance(t);

这就像您使用object. 处理反射时很常见。

更多信息请看这里

于 2012-10-13T17:56:27.407 回答
1

有人告诉你你不能,但你可以。

首先让我们看看你的代码:

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)。

于 2012-10-14T08:15:00.450 回答