创建一个n大多数未知类型的新实例

时间:2009-01-20 15:58:14

标签: c# generics oop

我想编写一个通用的方法来创建指定Type的新实例。我试过了

protected T CreateNew<T>()
    where T : new()
{
    return new T();
}

这样可行,但前提是我在编译时指定了类型,就像

一样
var x = CreateNew<Point>();

关键是,我需要做这样的事情

ISomeInterface inter;
if (selection == 1)
    inter = new SomeClass();
else
    inter = new SomeClass2();
// ...
ISomeInterface inter2 = CreateNew<typeof(inter)>();

SomeClass实现ISomeInterface。 但由于CreateNew()需要指定实际类型,因此无法编译。我不知道是否可以在运行时提供类似的东西,但上面的代码无法编译。

所以我有一个未知引用类型的实例,我需要创建几个相同类型的实例。

有没有人知道实现此行为的技巧?

2 个答案:

答案 0 :(得分:10)

泛型的要点是提供一种机制,当 compile -time知道类型时,可以为不同类型重用代码。在这种情况下,您在编译时不知道类型。

我建议您使用Activator.CreateInstance(inter.GetType());

答案 1 :(得分:1)

您可以使用lambda:

来完成
Function<ISomeInterface> creationDelegate;
if (selection == 1)
    creationDelegate = () => CreateNew<SomeClass>;
else
    creationDelegate = () => CreateNew<SomeClass2>;
ISomeInterface inter = creationDelegate();

// ...
ISomeInterface inter2 = creationDelegate();

在这种情况下,根据您的示例代码,我看不到使用CreateNew方法的好处,但我假设您的“真实”代码更复杂。