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语句不会编译。
答案 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中是相当标准的 - 为了完成你的工作,你需要一个新的类型。
((正如“动态”评论中所指出的那样,实际上是在编译时确定的,而不是典型使用该词的动态))