C# LINQ选择投影和不同的子类型

C# LINQ选择投影和不同的子类型,c#,linq,C#,Linq,我试图弄清楚如何使用LINQ.Select并将其投影到子类型类的新列表中。 下面的方法适合我,但我希望代码更干净一点,并且没有重复的对象初始化代码,这两种类型的代码都是相同的 基本上,如果布尔条件为真,我想返回一个包含1个子类的列表,如果不是,则返回另一个子类。方法签名使用IEnumerable并且工作正常 是否有一种推荐的方法可以在运行时使用特定的子类类型在select中动态创建新的子类,以便对象初始化只能声明一次?我尝试了几种方法,但似乎找不到正确的语法-例如,我想我可能可以获得类型并使用激

我试图弄清楚如何使用LINQ.Select并将其投影到子类型类的新列表中。 下面的方法适合我,但我希望代码更干净一点,并且没有重复的对象初始化代码,这两种类型的代码都是相同的

基本上,如果布尔条件为真,我想返回一个包含1个子类的列表,如果不是,则返回另一个子类。方法签名使用IEnumerable并且工作正常

是否有一种推荐的方法可以在运行时使用特定的子类类型在select中动态创建新的子类,以便对象初始化只能声明一次?我尝试了几种方法,但似乎找不到正确的语法-例如,我想我可能可以获得类型并使用激活器在LINQ中实例化子类。选择,但不知道这是否可行

private IEnumerable<BaseType> GetSubTypeList(IEnumerable<AnotherClass> sourceList, bool myCondition)
{
    if (myCondition)
    {
         return sourceList.Select(
             wc => new SubType1
             {
                 Field1 = "Field 1",
                 Field2 = "Field 2"
             }).ToList();
    }
    return sourceList.Select(
        wc => new SubType2
        {
            Field1 = "Field 1",
            Field2 = "Field 2"
        }).ToList();
 }
private IEnumerable GetSubsubjectList(IEnumerable sourceList,bool myCondition)
{
if(霉菌病)
{
返回源列表。选择(
wc=>新的子类型1
{
Field1=“Field1”,
Field2=“字段2”
}).ToList();
}
返回源列表。选择(
wc=>新的子类型2
{
Field1=“Field1”,
Field2=“字段2”
}).ToList();
}
私有IEnumerable GetSubsubjectList(IEnumerable sourceList,bool myCondition)=>
选择(sl=>GetSubType(myCondition,“字段1”、“字段2”);
私有基类型GetSubType(bool myCondition,字符串a,字符串b)=>
霉菌病
? 新的子类型1{Field1=a,Field2=b}
:新的子类型2{Field1=a,Field2=b}

我会将此标记为已回答-提出了一个解决方案,尽管它不能完全回答我的问题。我特别想知道是否有一种方法可以在LINQ.Select和对象初始化中实现这一点

但是我成功地清除了重复,使用了Nafis-Islam的答案,将对象初始化和赋值移动到一个helper函数中,然后使用它的类型和Activator类创建列表中的每个对象

以下是我的想法:

private IEnumerable<BaseClass> GetSubTypeList(IEnumerable<AnotherClass> sourceList, bool myCondition)
{
  return sourceList.Select(sl => 
         GetSubType(myCondition, sl.Field1, sl.Field2)).ToList();
}

private BaseClass GetSubType(bool myCondition, string field1, string field2)
{
   var type = myCondition ? typeof(SubType1) : typeof(SubType2);
   var item = (BaseClass) Activator.CreateInstance(type);
   item.Field1 = "Field 1";
   item.Field2 = "Field 2";
   return item;
}

private IEnumerable GetSubsubjectList(IEnumerable sourceList,bool myCondition)
{
返回源列表。选择(sl=>
GetSubType(myCondition,sl.Field1,sl.Field2)).ToList();
}
私有基类GetSubType(布尔myCondition,字符串字段1,字符串字段2)
{
变量类型=霉菌病?类型(亚型1):类型(亚型2);
var item=(基类)Activator.CreateInstance(类型);
item.Field1=“字段1”;
item.Field2=“字段2”;
退货项目;
}

返回的列表现在将是正确子类的类型,并且对象初始化不会重复。

这些类型是否有一个定义属性(接口或父类)的公共取消器?如果没有,这是你能做的最好的了。否则,您可以将创建和元素设置分离到单独的步骤中。谢谢-通过将初始化副本移动到帮助器方法中,这确实使选择变得更干净。我认为可能有一种方法可以在运行时动态地计算出类型并实例化新的类型列表-但是还没有找到一种方法(甚至是可能的)谢谢Nafis-请参见下面我的答案
private IEnumerable<BaseClass> GetSubTypeList(IEnumerable<AnotherClass> sourceList, bool myCondition)
{
  return sourceList.Select(sl => 
         GetSubType(myCondition, sl.Field1, sl.Field2)).ToList();
}

private BaseClass GetSubType(bool myCondition, string field1, string field2)
{
   var type = myCondition ? typeof(SubType1) : typeof(SubType2);
   var item = (BaseClass) Activator.CreateInstance(type);
   item.Field1 = "Field 1";
   item.Field2 = "Field 2";
   return item;
}