gpt4 book ai didi

c# - 当 HashSet 作为对象提供并且 T 可以是任何东西时,如何循环遍历它?

转载 作者:行者123 更新时间:2023-11-30 14:13:01 24 4
gpt4 key购买 nike

我正在使用值注入(inject)器从一种类型映射到另一种类型,使用 LoopValueInjection 并使用一些自定义逻辑覆盖 SetValue(object v) 方法。我正在尝试检测何时传入 HashSet 并通过 HashSet 并对其中的每个项目应用一种方法以进行一些清理。我遇到的问题是因为参数只是一个对象,我不知道 HashSet 中的项目类型是什么。例如,它可以是 HashSet 或 HashSet。

这是我目前拥有的代码,但我收到了 InvalidCastException。

    protected override object SetValue(object v)
{
if (type.Name == "HashSet`1")
{
var genericType = type.GetGenericArguments()[0];

// this line throws the InvalidCastException
var cleanHashSet = (HashSet<object>)Activator.CreateInstance(type);

foreach (var item in (HashSet<object>)v) // I'm sure this cast will throw as well
{
cleanHashSet.Add(Clean(item));
}

return cleanHashSet;
}

return base.SetValue(v);
}

我想主要问题是一旦我确定它实际上是某种 HashSet,我如何循环遍历作为对象传入的 HashSet?我还想我还需要创建一个新的特定类型的空 HashSet,这样我就可以将每个被清理的项目放入其中。

最佳答案

在 .NET 中,只有接口(interface)和委托(delegate)类型可以协变和逆变。所以不可能投HashSet<SomeType>HashSet<object> .

您想转换您的 vIEnumerable 的非通用版本界面

dynamic cleanHashSet = Activator.CreateInstance(type);
foreach (object item in (IEnumerable)v)
{
cleanHashSet.Add(Clean(item));
}

如果你不想使用dynamic关键字,那么您需要调用Add反射法

object cleanHashSet = Activator.CreateInstance(type);
var method = type.GetMethod("Add");
foreach (object item in (IEnumerable)v)
{
method.Invoke(cleanHashSet, new object[] { Clean(item) });
}

关于c# - 当 HashSet<T> 作为对象提供并且 T 可以是任何东西时,如何循环遍历它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15491341/

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