2017-05-12 10 views
0
interface ISample 
{ 
    int Id { get; set; } 
} 
public class MyClass : ISample 
{ 
    public int Id 
    { 
     get; 
     set; 
    } 
    public string Name { get; set; } 
} 

上記は、インターフェイスISampleを実装するクラスです。ジェネリックを使用して、私は与えられた型のオブジェクトを別の型に変換するために以下のメソッドを追加しました。ジェネリックC#キャスト

どのように私は戻ってISampleがTResultはTSOURCEを実装どこTSOURCEとTResultはMyClassのですMyClassのオブジェクトに変換したいISampleオブジェクトを与えられているのと同じの逆を達成しないジェネリックを使用して
private TResult Sample<TSource, TResult>(TSource source) 
      where TSource : TResult 
{ 
    return (TResult)(source); 
} 

+5

'ISample'のインスタンスを持っている場合、実際にはそのインスタンスを' MyClass'のインスタンスであることを保証し、そのインタフェースを実装しているインスタンスではないからです。とにかく、なぜこの方法がありますか?シンプルな '(ISample)myInstanceOfMyClass'はあなたのために何をしますか? – HimBromBeere

+0

'TSource'が' TResult'(そこに設定したもの)から継承すると、 'TSource'型のオブジェクトはすでに暗黙のうちに' TResult'にキャストダウンされている可能性があります。しかし、私はそれを逆にすると( 'TResult'は' TSource'を継承します)、変換が可能であることをいくらか保証することができると思います。少なくとも実行時例外の代わりにコンパイラエラーが発生します。 – Flater

答えて

1

あなたは単に

private TResult ToInterface<TSource, TResult>(TSource source) where TSource : TResult 
{ 
    return source; 
} 

private TResult FromInterface<TSource, TResult>(TSource source) where TResult : TSource 
{ 
    return source as TResult; 
} 

FromInterface機能がスローされますことに注意してくださいように見えるかもしれませんコードで終わる

where TResult : TSource 

where TSource : TResult 

から切り替える必要がありますInvalidCastException - 'source'パラメータがTResult型でないかTResから継承しない場合ウルトラ。


編集:

ラヨシュアルパドによって答えを参照してください。

+0

キャスト 'as'を使用して例外を回避し、例外を投げるのではなく、無効キャストを処理する方法を関数のユーザに選択させることができます。 –

+0

これは当てはまりますが、問題は、無効なキャストを処理するのではなく、階層内の型間でキャストするための汎用ソリューションを作成することでした。私はそれが理想的ではないことに同意する。 – fshauge

1

TSourceからTResultへのダウンキャスティングを行う予定であることをコンパイラは事前に知っていません。あなたがobject最初にTSourceをキャストする必要がありますので、きっとTResultのスーパークラスである何かにあなたのTSourceインスタンスをキャストする必要があります。

(TResult)((object)source) 

はEDIT:

によってコメント欄で指摘したように@ZdeněkJelínek、Eric Lippertはブログpost aboutを書いています。

+1

あなたの解決策は正しいです。エリック・リッペルト氏はこれについてもっと広範な説明をしてブログをしています:https://ericlippert.com/2015/10/14/casts-and-type-parameters-do-not-mix/ –

+1

@ZdeněkJelínekあなたのご意見ありがとうございました。これらの貴重な詳細を答えに加えました。 –

関連する問題