C# 使用IEnumerable进行设置时,自定义IEnumerable实现失败

C# 使用IEnumerable进行设置时,自定义IEnumerable实现失败,c#,interface,operator-overloading,ienumerable,C#,Interface,Operator Overloading,Ienumerable,我正在尝试构建一个实现IEnumerable的自定义类型,因为我需要一个自定义类型转换器。目前我有: [TypeConverter(typeof(StringListTypeConverter))] public class StringList<T> : IEnumerable<T>, IStringConvertible { // ... implementations of IEnumerable<T> } 我得到一个错误: “System.S

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

[TypeConverter(typeof(StringListTypeConverter))]
public class StringList<T> : IEnumerable<T>, IStringConvertible
{
    // ... implementations of IEnumerable<T>
}
我得到一个错误:

“System.String[]”到“StringList”

“System.Collections.Generic.IEnumerable”到“StringList”。存在显式转换。是否缺少强制转换

请注意注释中的问题。我想通过QueryString将类型为T的IEnumerable传递给我的api服务器。为了使URL尽可能短,我只需要参数?MyProp=test,另一个字符串,evenMoreString&MyIntProp=1,4,12134。 在服务器端,我想将这个字符串转换回IEnumerable,以防示例QueryString转换为IEnumerable和IEnumerable

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

public static implicit operator StringList<T>(IEnumerable<T> elements)
{
    return new StringList<T>(elements);
}
但这在C规范中是禁止的。那么,由于这是一个相当大的重构过程,我该怎么做才能只更改属性的类型而不是设置属性的整个代码呢

MyProp=new[]{test}

如果MyProp属性类型为StringList,则无法为其分配数组实例,因为数组不是从中派生的

MyProp=SomeListArray.Selects=>${s}\u测试

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

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


为什么不直接添加显式cast?@S.Petrosov,因为这意味着重构设置了IEnumerables的所有代码,这是我想要避免的。为什么名为StringList的类型有类型参数t?它不应该只是类StringList:IEnumerable吗?您可以编写一个LINQ扩展方法,如.ToStringList as is.ToList@Evk,它之所以命名为so,是因为它用于将t的枚举作为字符串列表发送到服务器,以保持url简短。在服务器端,它应该恢复为具体的IEnumerable,因为T可以是string、Guid、int甚至是enum……这也意味着要重构此类setter的每一次出现。对于显式强制转换也是如此。您是否可以保留属性类型IEnumerable,并在需要StringList时调用扩展方法或强制转换它?如果您试图避免重构,并且您的代码可以很好地使用IEnumerable属性,只需保留它,并且仅在需要时使用StringList即可。
public static implicit operator StringList<T>(IEnumerable<T> elements)
{
    return new StringList<T>(elements);
}
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();