gpt4 book ai didi

c# - 自定义 IEnumerable 实现无法使用 IEnumerable 进行设置

转载 作者:行者123 更新时间:2023-11-30 18:17:23 25 4
gpt4 key购买 nike

我正在尝试构建一个实现 IEnumerable<T> 的自定义类型因为我需要一个自定义类型转换器。目前我有这个:

[TypeConverter(typeof(StringListTypeConverter))]
public class StringList<T> : IEnumerable<T>, IStringConvertible
{
// ... implementations of IEnumerable<T>
}

但是,当我从 IEnumerable<string> MyProp 更改我的旧属性类型时至 StringList<T> MyProp设置这些属性时出现错误,例如

MyProp = new[]{"test"};
MyProp = SomeListArray.Select(s => $"{s}_test");

我得到错误:

'System.String[]' to 'StringList<String>'

'System.Collections.Generic.IEnumerable<String>' to 'StringList<String>'. An explicit conversion exists (are you missing a cast?)

请注意评论中的问题。我想传递一个 IEnumerable类型 T通过QueryString到我的 api 服务器。为了使 URL 尽可能短,我只需要参数 ?MyProp=test,anotherstring,evenMoreString&MyIntProp=1,4,12,134 .在服务器端,我想将此字符串转换回 IEnumerable<T> (例如 QueryStringIEnumerable<string>IEnumerable<int> )。

我已经尝试添加一个隐式运算符

public static implicit operator StringList<T>(IEnumerable<T> elements)
{
return new StringList<T>(elements);
}

但这在 C# 规范中是被禁止的。那么,我该怎么做才能只更改属性的类型而不是设置它们的整个代码(因为这是一个相当大的重构)?

最佳答案

MyProp = new[]{"test"};

如果您的 MyProp属性类型是 StringList<T> ,你不能给它分配一个数组实例,因为 Array 不是从它派生的。

MyProp = SomeListArray.Select(s => $"{s}_test");

几乎一样。 LINQ 返回 IEnumerable,它不是从 StringList 派生的。您不能将基类型对象分配给派生类型的变量。

您可以添加扩展方法并在需要时使用它StringList<T>对象:

public static class StringListExtensions
{
public static StringList<T> ToStringList<T>(this IEnumerable<T> elements)
{
return new StringList<T>();
}
}

MyProp = SomeListArray.Select(s => $"{s}_test").ToStringList();

关于c# - 自定义 IEnumerable 实现无法使用 IEnumerable 进行设置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43914504/

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