gpt4 book ai didi

c# - 当 T 为 IEnumerable 时,将类型 T 的泛型参数转换为 List

转载 作者:行者123 更新时间:2023-11-30 20:50:29 25 4
gpt4 key购买 nike

我的应用程序有一个缓存值的方法。我需要第二种方法来检查类型 T 的泛型参数是否实现了 IEnumerable 而不是实现了 IList。如果答案是肯定的,该方法应该执行 .ToList 并将其转换回 T(请参阅代码示例中的注释)。

你能告诉我如何执行 .ToList() 以返回转换为 T 的列表吗?(这真的可能吗?)

像这样:

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() 的原因。

最佳答案

如果您不介意使用dynamic,动态类型和重载可能会有所帮助:

object ConvertToListIfNecessary(dynamic input)
{
return MaybeToList(input);
}

private IList<T> MaybeToList<T>(IEnumerable<T> input)
{
return input.ToList();
}

private IList<T> MaybeToList<T>(IList<T> input)
{
return input;
}

private object MaybeToList(object input)
{
// Take whatever action you want if the input *doesn't* implement
// IEnumerable<T>
}

基本上,这让 dynamic 背后的智能为您完成低劣的反射工作。它可能不像手动滚动的那样快,但它可能很多更容易正确。

关于c# - 当 T 为 IEnumerable<TP> 时,将类型 T 的泛型参数转换为 List<TP>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22500124/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com