2017-05-11 9 views
3

私はカスタムタイプコンバータが必要なのでIEnumerable<T>を実装するカスタムタイプを作成しようとしています。私はIEnumerable<string> MyPropからStringList<T> MyPropに私の古いプロパティの種類を変更したときに、これらのプロパティは、例えば設定されているとき、私はエラーを取得し、しかしIEnumerableでカスタムのIEnumerable実装が失敗する

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

:現在、私はこれを持っていますコメントからの質問のよう

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

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

注:

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

私はエラーを取得します。 TIEnumerableQueryString経由でapi-serverに渡したいとします。 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プロパティの型がStringList<T>ある場合は、配列はそれから派生しませんbecause

+0

を? –

+0

@ S.Petrosovこれは、これらのIEnumerablesが設定されているすべてのコードをリファクタリングすることを意味するため、私は避けたいものです。 – KingKerosin

+0

名前付きStringListの型がパラメータTを持つ理由は? 'class StringList:IEnumerable 'でなければならないのですか? – Evk

答えて

0

MyProp = new[]{"test"};

は、あなたは、それに配列インスタンスを割り当てることはできません。

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

ほぼ同じです。 LINQはStringListから派生しないIEnumerableを返します。派生型の変数に基本型オブジェクトを割り当てることはできません。

あなたは、拡張メソッドを追加し、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(); 
+0

これはまた、そのようなセッターの各出現をすべてリファクタリングすることを意味します。明示的なキャストでも同じです。 – KingKerosin

+0

プロパティの型IEnumerable を残して、StringList が必要なときはいつでも、拡張メソッドを呼び出すか、キャストできますか?リファクタリングを避けようとしていて、コードがIEnumerable のプロパティでうまく動作する場合は、そのまま残して、必要な場合のみStringListを使用してください。 – Yevgeniy

関連する問題