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

时间:2017-05-11 11:44:37

标签: c# interface operator-overloading ienumerable

我正在尝试构建一个实现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");

我收到错误:

  

&#39; System.String []&#39; to&#39; StringList&lt; String&gt;&#39;

     

&#39;&System.Collections.Generic.IEnumerable LT;字符串&GT;&#39; to&#39; StringList&lt; String&gt;&#39;。存在显式转换(您是否错过了演员?)

注意评论中的问题。我想通过IEnumerableT类型QueryString传递给我的api-server。为了使网址尽可能短,我只想要参数?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#规范禁止这样做。那么,我该怎么做只改变属性的类型而不是整个代码(因为这是一个非常大的重构)?

1 个答案:

答案 0 :(得分:0)

  

MyProp = new [] {&#34; test&#34;};

如果您的MyProp属性类型为StringList<T>,则无法为其分配数组实例,因为Array不是从它派生的。

  

MyProp = SomeListArray.Select(s =&gt; $&#34; {s} _test&#34;);

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

您可以添加扩展方法,并在需要StringList<T> object:

时使用它
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();