【问题标题】:Creating a new instance of n mostly unknown type创建 n 个几乎未知类型的新实例
【发布时间】:2009-01-20 15:58:14
【问题描述】:

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

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

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

有人知道实现这种行为的技术吗?

【问题讨论】:

    标签: c# generics oop


    【解决方案1】:

    泛型的意义在于提供一种机制,当类型在编译时已知时,可以将代码重用于不同的类型。在这种情况下,您在编译时不知道类型。

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

    【讨论】:

    • 非常感谢!我只是对泛型方法感到困惑,因为我想我没有正确理解用 C# 编写的泛型,简而言之,泛型可以在运行时重用(不像 C++ 模板)
    • 是的,.NET 中的泛型类型在执行时重用(即代码只定义一次),但类型必须选择在编译时(抛开反射)。
    【解决方案2】:

    您可以使用 lambda:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-01-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-30
      • 1970-01-01
      相关资源
      最近更新 更多