我在设计这个从原型对象创建实例的系统时遇到了麻烦。这就是我所拥有的:
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(),因为性能问题(我会经常运行这个函数)。
感谢您的任何建议。
答案 0 :(得分:2)
问题是泛型是编译时功能。您正在尝试创建在运行时确定类型的对象。
因此,您无法使用泛型来执行此操作。
当你调用Create(value as object);
时,类型参数T
是object
(因为它是在编译时从参数的编译时类型推断出来的),所以你得到一个{ {1}}已退回。
您可以致电new object()
并获取另一个Create<Foo>
实例,但是如果不大量使用反射,则无法使用Foo
并调用相应的Type type
。