我正在尝试构建一个实现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;。存在显式转换(您是否错过了演员?)
注意评论中的问题。我想通过IEnumerable
将T
类型QueryString
传递给我的api-server。为了使网址尽可能短,我只想要参数?MyProp=test,anotherstring,evenMoreString&MyIntProp=1,4,12,134
。
在服务器端,我想将此字符串转换回IEnumerable<T>
(如果示例QueryString
为IEnumerable<string>
和IEnumerable<int>
)。
我已经尝试添加隐式运算符
public static implicit operator StringList<T>(IEnumerable<T> elements)
{
return new StringList<T>(elements);
}
但是C#规范禁止这样做。那么,我该怎么做只改变属性的类型而不是整个代码(因为这是一个非常大的重构)?
答案 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();