【发布时间】:2014-03-19 08:29:55
【问题描述】:
我的应用程序有一个缓存值的方法。我需要第二种方法来检查 T 类型的泛型参数是否实现了 IEnumerable 而不是实现了 IList。如果答案是肯定的,该方法应该执行一个 .ToList 并将其转换回 T(参见代码示例中的注释)。
你能告诉我如何使用 .ToList() 将一个转换为 T 的 List 返回吗?(真的有可能吗?)
类似这样的:
public T ToListIfIEnumerable<T>(T value)
{
var needToCovert = TypeImplementsGenericIEnumerableButNotGenericIList(value);
if (!needToCovert)
{
return value;
}
// return value.ToList() <-- How to do that???
}
private bool TypeImplementsGenericIEnumerableButNotGenericIList<T>(T value)
{
var type = value.GetType();
var interfaces = type.GetInterfaces();
var gi = typeof(IEnumerable<>);
var gl = typeof(IList<>);
// It would be better if the next lines did't compare strings!
// Suggestions welcome...
var implementsIEnumerable = interfaces.Any(
i => i.IsGenericType && i.Name == gi.Name && i.Namespace == gi.Namespace);
var implementsIList = interfaces.Any(
i => i.IsGenericType && i.Name == gl.Name && i.Namespace == gl.Namespace);
return implementsIEnumerable && !implementsIList;
}
背景信息:
使用该方法的对象执行类似 Lazy 的操作。缓存 IEnumerable 在以下示例中没有多大意义:Enumerable.Range(1, 3).Select(i => Guid.NewGuid()) 每次调用它时都会提供新的 Guid。这就是为什么我想做一个 ToList()。
【问题讨论】:
标签: c# linq generics reflection linq-to-objects