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

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

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

有谁知道达到这种行为的技术?

最佳答案

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

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

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


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

07-25 21:05