2011-02-01 10 views
2

タイプキャストでこれまでに遭遇したことのない問題が発生しています。'TextmlBatchDeleteDocument'タイプのオブジェクトを 'System.String'にキャストすることができません

TextmlBatchDeleteDocument型のオブジェクトをSystem.Stringにキャストしようとしているため、これを処理する明示的な型変換演算子を実装しました。

public override string ToString() 
{ 
    return string.Format("{0}{1}", this.Collection, this.Name); 
} 

public static explicit operator string(TextmlBatchDeleteDocument doc) 
{ 
    return doc.ToString(); 
} 

成功しました。

TextmlBatchDeleteDocument doc = new TextmlBatchDeleteDocument("name", "/collection/"); 
string someString = (string)doc; 

私はIListを実装し、それが最終的に文字列としてリスト内のオブジェクトを使用するオブジェクトを必要とサードパーティの関数にタイプList<TextmlBatchDeleteDocument>のオブジェクトを渡していますが。これは私が困っているところです。私はサードパーティ関数を呼び出そうとする度にこの例外を取得します。

「NWDA_Common.Textml.TatchmlBatchDeleteDocument」タイプのオブジェクトを「System.String」と入力してキャストできません。

私の仮定が正しければ、私は関数にタイプList<TextmlBatchDeleteDocument>のオブジェクトを渡していますが、その後、基本型System.Objectとして私のリストで任意のオブジェクトを扱いますどのIListにキャストします。私はこの理論を確認するためのテストを行い、同じ例外がありました。私がタイプList<TextmlBatchDeleteDocument>のオブジェクトをSystem.Objectにキャストした後、文字列へのキャストを試みると例外がスローされます。

TextmlBatchDeleteDocument doc = new TextmlBatchDeleteDocument("name", "/collection/"); 
object docAsObj = doc; 
string someString = (string)docAsObj; 

この問題を解決する方法を知っているか、私はリファクタリングし、別の方法を見つけることで立ち往生しています誰もがありますか?

答えて

4

サードパーティのコンポーネントのように聞こえます実際にはにはIListが必要です。ここでは各要素が文字列です。これを指定する必要があります。変換は多態的には適用されません。ソース式のコンパイル時の型に基づいてコンパイル時に選択します。

基本的には、各要素の変換を自分で行い、変換された項目のリストを第三者のコードに渡す必要があります。

+0

これは私が聞くと予想されていたものです。私はちょうどそれにトリックがあることを望んでいました。 – Wade

+0

+1。すべての演算子、変換が含まれている場合はTrueです。 –

+0

オブジェクトがSystem.Objectにキャストされると、子クラスに定義されている演算子がすべて失われると結論付けることになります。 – Wade

関連する問題