如何便捷地将IEnumerable转换为TheoryData?
实现IEnumerable到TheoryData的便捷转换
可以通过自定义LINQ扩展方法实现流畅的转换,完美契合链式调用风格,同时保留TheoryData的编译时类型检查优势。
单参数场景的扩展方法
先针对单参数的TheoryData<T>编写基础扩展:
public static class TheoryDataExtensions { public static TheoryData<TResult> ToTheoryData<TSource, TResult>( this IEnumerable<TSource> source, Func<TSource, TResult> selector) { var theoryData = new TheoryData<TResult>(); foreach (var item in source) { theoryData.Add(selector(item)); } return theoryData; } // 简化版:无需转换时直接复用元素本身 public static TheoryData<T> ToTheoryData<T>(this IEnumerable<T> source) { return source.ToTheoryData(x => x); } }
枚举场景的实际用法
现在就能像你期望的那样链式调用了:
// 和你示例一致的带转换逻辑写法 var dbEnumOptions = Enum.GetValues(typeof(MyEnum)) .Cast<MyEnum>() .ToTheoryData(v => v); // 直接复用枚举元素的简化写法 var dbEnumOptions = Enum.GetValues(typeof(MyEnum)) .Cast<MyEnum>() .ToTheoryData();
多参数场景扩展(可选)
如果需要支持多参数的TheoryData<T1, T2>等,可以继续重载扩展方法:
public static TheoryData<T1, T2> ToTheoryData<TSource, T1, T2>( this IEnumerable<TSource> source, Func<TSource, T1> selector1, Func<TSource, T2> selector2) { var theoryData = new TheoryData<T1, T2>(); foreach (var item in source) { theoryData.Add(selector1(item), selector2(item)); } return theoryData; }
核心优势
- 完全延续LINQ的流畅编程风格,无需打断链式操作
- 依托TheoryData的编译时类型检查,避免MemberData常见的运行时类型不匹配问题
- 扩展方法通用,适用于任何IEnumerable数据源,不局限于枚举
内容的提问来源于stack exchange,提问作者matt
相关产品推荐
相关产品推荐

