你可以在运行时在linq语句中动态转换吗?

时间:2014-12-19 15:23:59

标签: c# linq

Hello有没有办法在下面的代码中动态转换,所以我不需要一堆if代码几乎相同的if语句?

        List<DateTime> dateTimeList = null;

        if(_dataSeriesList[0].GetType().Name == "Class1")
        {
            dateTimeList =
                _dataSeriesList.ConvertAll(x => (Class1) x)
                    .Where(d => d.Time >= min && d.Time <= max)
                    .OrderBy(t => t.Time)
                    .Select(d => d.Time)
                    .ToList();
} 
else if(_dataSeriesList[0].GetType().Name == "Class2")
{
                dateTimeList =
                _dataSeriesList.ConvertAll(x => (Class2) x)
                    .Where(d => d.Time >= min && d.Time <= max)
                    .OrderBy(t => t.Time)
                    .Select(d => d.Time)
                    .ToList();
}
.
.
and so on

我尝试使用以下代码:

    public static T Cast<T>(object o)
    {
        return (T)o;
    }

Type t2 = _dataSeriesList[0].GetType();

dateTimeList =
                _dataSeriesList.ConvertAll(x => castMethod.Invoke(null, new object[] { x }))
                    .Where(d => d.Time >= min && d.Time <= max)
                    .OrderBy(t => t.Time)
                    .Select(d => d.Time)
                    .ToList();

但是linq语句不会编译。

1 个答案:

答案 0 :(得分:1)

如果他们不共享一个共同的基本类型,你可以这样做:

 dateTimeList = 
    _dataSeriesList.Select(x => { 
        if (x.GetType().Name == "Class1") 
          return ((Class1)x).Time;
        else
          return ((Class2)x).Time;
                   })
                 .Where(d => d >= min && d <= max)
                 .OrderBy(t => t)
                 .Select(d => d)
                 .ToList();

由于您所做的只是使用时间元素,您只需根据您的规则选择感兴趣的项目,然后以通用方式使用它。

当然,如果您正在使用的内容更复杂,请选择该信息。

这在Linq中是相当标准的 - 为了完成你的工作,你需要一个新的类型。

((正如“动态”评论中所指出的那样,实际上是在编译时确定的,而不是典型使用该词的动态))