如果只采用非具体对象,如何使用new()约束设计泛型方法?

时间:2015-07-08 00:51:47

标签: c# generics interface

我在设计这个从原型对象创建实例的系统时遇到了麻烦。这就是我所拥有的:

Dictionary<Type, IFoo> Prototypes;
object CreateInstance(Type type)
{
    IFoo value;
    if (!Prototypes.TryGetValue(type, out value))
    {
        value = Activator.CreateInstance(type) as IFoo;
        Prototypes.Add(type, value);
    }
    return Create(value as object);
}

T Create<T>(T instance) where T : new()
{
    return new T(); // this just returns a new blank object
}

我知道问题在于我无法保证这些对象具有无参数构造函数。但那我该怎么办?在IFoo中没有办法指定无参数构造函数,是吗?我唯一能想到的是在IFoo中指定一个简单的Create()函数,但我希望它能成为一个解决方案,它不会在我的代码库中注入大量新的样板代码。

我不能每次都调用Activator.CreateInstance(),因为性能问题(我会经常运行这个函数)。

感谢您的任何建议。

1 个答案:

答案 0 :(得分:2)

问题是泛型是编译时功能。您正在尝试创建在运行时确定类型的对象。

因此,您无法使用泛型来执行此操作。

当你调用Create(value as object);时,类型参数Tobject(因为它是在编译时从参数的编译时类型推断出来的),所以你得到一个{ {1}}已退回。

您可以致电new object()并获取另一个Create<Foo>实例,但是如果不大量使用反射,则无法使用Foo并调用相应的Type type