如何在linq查询中动态实例化更具体的类型

时间:2012-12-06 15:34:29

标签: c# linq reflection instantiation

我有一个linq查询,该查询当前正在基于泛型类型参数进行对象实例化。我实际上需要实例化泛型参数的更具体的子类。有没有办法用派生类型进行实例化?如果有必要的话,我可以使用反射甚至直接发射IL,尽管如果可能的话我还想尝试对基类的属性进行类型检查。

所以我的代码是这样的:

IQueryable<TType> myObjects = from blah in blahblah
                              select new TType
                              {
                                   PropertyA = someValue;
                                   PropertyB = someOtherValue;
                              }

但我需要IQueryable中的对象实际上是来自TType的派生类。我事先并不知道它们将成为哪个派生类,只是基于其他一些逻辑它们都是相同的派生类型。

1 个答案:

答案 0 :(得分:1)

听起来你需要工厂模式:

from blah in blahblah
select BaseTypeFactory.Create(/* parameters/objects necessary to create the BaseType*/)

BaseTypeFactory然后会做任何事情来吐出正确的派生BaseType实例。

如果(正如您的评论所说)TType被约束为特定的基本类型,则Factory可能看起来像:

(假设TTypewhere 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.

}