gpt4 book ai didi

C# 非通用 ISet 接口(interface)

转载 作者:太空宇宙 更新时间:2023-11-03 12:04:33 25 4
gpt4 key购买 nike

.NET 4.0 引入了一个非泛型 IList,它公开了向 List 添加值的能力,而无需知道泛型类型。这很有用,因为它允许我编写如下方法:

void CreateListFromBytes(IntPtr bytes, Type outputType, out object outputObject)
{
Type elementType = outputType.GenericTypeArguments[0];
int numberOfElements = ReadHeaderBytes(bytes);
bytes += Marshal.SizeOf(typeof(int));

IList outputList = (IList) Activator.CreateInstance(outputType);
for (int i = 0; i < numberOfElements; i++)
{
object element = ReadDataBytes(bytes, elementType);
bytes += Marshal.SizeOf(elementType);
outputList.Add(element);
}

outputObject = outputList;
}

但是,当我尝试为 HashSetISet 实现一个具有类似风格的方法时,我找不到这样的非通用接口(interface),它公开了和 Add() 方法。

我想知道是否存在我可能错过的这样的界面。如果没有,我想知道如何将元素添加到我确定是 Set 的对象(因为我创建了它 Activator.CreateInstance())

最佳答案

我最终会得到一些用于构建集合的辅助类型:

interface ISetBuilder 
{
void Add(object item);
object Build();
}

class SetBuilder<T, TSet> : ISetBuilder where TSet : ISet<T>, new()
{
private readonly TSet _set = new TSet();

public void Add(object item)
{
if (!(item is T typedItem))
{
throw new ArgumentException();
}

_set.Add(typedItem);
}

public object Build() => _set;
}

然后可以像这样使用这些类型:

var builderType = typeof(SetBuilder<,>).MakeGenericType(elementType, outputType);
var builder = (ISetBuilder) Activator.CreateInstance(builderType);
var element = CreateElement(...);
builder.Add(element);
var set = builder.Build();

是的,这也可以推广到支持列表。只需替换 ISet<T>ICollection<T> .

另一种可能(但不太稳健)的解决方案是查找并调用特定的 Add使用反射的集合方法。

关于C# 非通用 ISet 接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55732764/

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