2016-09-15 8 views
7

私には制御できないコードがあります。渡すことができる(KnownTypeに由来していない)カスタムクラスMyClassを設計するためにC#で、それは可能ですキャスト演算子を使用したC#動的変換

KnownType item = (KnownType) parameter; 

:このコードは、オブジェクトパラメータを受け取り、次のようにコンパイル時に知られている型にキャストしようとします私はこのようなカスタム変換演算子を実装するために試みた

protected KnownType ConvertToKnownType() 
{ 
    // conversion code goes here 
} 

と上記のコードによって KnownTypeに変換する上記のコードのパラメータは、 MyClassがそのメンバメソッドを使用して KnownTypeに自身を変えることができることを条件とします
public static implicit operator KnownType(MyClass source) 
{ 
    KnownType result; 
    // conversion goes here 
    return result; 
} 

しかし、動作しませんでした(使用されませんでした)。キャスト演算子は、コンパイル時にソース・タイプ、ターゲット・タイプおよび変換演算子がわかっている場合にのみ動作すると仮定するのは正しいですか?

編集: 私はそれが無関係であり、主にキャスト演算子が実装されている方法に興味があるので、変換を行うコードの詳細については当初提供しませんでした。つまり、ランタイム適切なコンバータを見つけるためにタイプするか、コンパイル時に決定されますか? MyClassは、いくつかの他のタイプから派生していDataRowViewのラッパークラスですしながら、物事をクリアするには

KnownTypeは、実際DataRowViewです。 MyClassDataRowViewへの参照を保持します。 DataViewにバインドする代わりにIList<MyClass>にバインドしますが、をバインドしているかのようにDataRowViewの列の値にアクセスできるようにするには、まだComboBoxが必要です。残念ながら、キャスト演算子は私が恐れていたように動作します。コンバート時の型情報を考慮に入れるだけです(ただし、同じ継承ツリーの型間でキャストするときは実行時の型情報を使用します)。

+1

'MyType'インスタンスのプロパティに基づいて構築された' KnownType'のインスタンスを返す関数で 'MyType'を作成してみませんか? 'myType.ToKnownType()'を 'KnownType'を期待する関数に渡すことができます。 – xxbbcc

+0

@xxbbcc彼は、彼が変換を行っているクラスを支配していないと言いました。 – Servy

+0

また、渡すオブジェクトをチェックするためにコードが行っていることも正確に依存します。オブジェクトが正確な型であり、継承されていないオブジェクトであることを明示的にチェックしている可能性があります。 – DavidG

答えて

6

いいえ、できません。あなたがそのクラスからあなたのクラスを派生させることができるなら、提供されたキャストはだけ成功します。継承に基づいていない変換のどのようなタイプでも、変換を実行しているクラスは、それが行っていることとは異なる何かをする必要があります。

キャスト演算子は、ソースタイプ、ターゲットタイプ、変換演算子がコンパイル時にわかっている場合にのみ動作するとします。

はい。

+0

'KnownType'が* interface *(または' MarshalByRefObject'から派生した型)の場合、透明なプロキシを 'parameter'として提供することでランタイムをカスタム変換関数を呼び出すようにすることができます。 'RealProxy'実装)。 –

関連する問題