2009-01-20 54 views
1

我想编写一个通用的方法,该方法创建指定类型的新实例。我试图创建一个n最常见的类型的新实例

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()需要指定的实际类型,因此无法编译。我不知道在运行时是否可以提供类似的内容,但上面的代码无法编译。

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

有谁知道一种技术来实现这种行为?

回答

1

您可以使用Lambda做到这一点:

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

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

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

10

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

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

+0

非常感谢! 我只是对通用方法感到困惑,因为我猜我没有正确理解用C#编写的泛型的一些内容,说明泛型可以在运行时重用(与C++模板不同) – 2009-01-20 16:09:55