我有一个linq查询,该查询当前正在基于泛型类型参数进行对象实例化。我实际上需要实例化泛型参数的更具体的子类。有没有办法用派生类型进行实例化?如果有必要的话,我可以使用反射甚至直接发射IL,尽管如果可能的话我还想尝试对基类的属性进行类型检查。
所以我的代码是这样的:
IQueryable<TType> myObjects = from blah in blahblah
select new TType
{
PropertyA = someValue;
PropertyB = someOtherValue;
}
但我需要IQueryable中的对象实际上是来自TType的派生类。我事先并不知道它们将成为哪个派生类,只是基于其他一些逻辑它们都是相同的派生类型。
答案 0 :(得分:1)
听起来你需要工厂模式:
from blah in blahblah
select BaseTypeFactory.Create(/* parameters/objects necessary to create the BaseType*/)
BaseTypeFactory
然后会做任何事情来吐出正确的派生BaseType
实例。
如果(正如您的评论所说)TType
被约束为特定的基本类型,则Factory可能看起来像:
(假设TType
受where TType : BaseType
)
public void BaseType TTypeFactory.Create(/* parameters/objects needed to create Base Types*/)
{
// full of assumptions, modify to fit your needs:
switch( typeID /*or some othervariable designating type to create*/)
case 1: // DerivedType 1
return new DerivedType1 { /* initialization parameters */ };
break;
case 2:
return new DerivedType2 { /* initialization parameters */ };
break;
// etc.
}