私は流暢な拡張メソッドを試しています。一般的な制約を値型で使用する
安全なキャストを実行する次の簡単な拡張方法があります。
public static T As<T>(this Object source)
where T : class
{
return source as T;
}
これはうまく働いたが、私は問題に走った過負荷
public static T As<T>(this ValueType source)
where T : struct
{
return (T)source;
}
と値型を使用することを直感的にしようとしたとき。メソッド解決ロジックは、常に上記の最初のメソッドを選択し、構造体がクラスではない(正確に)構文エラーを返します。
上記を処理する方法はありますか、または同じメソッドですべての型をテストして処理するときに制約を削除する方法はありますか?
====編集:質問に答えるため====
私は3.5フレームワークに対して、これをコンパイルしています。私は特に何かを達成しようとはしていません。これは上記の実験に過ぎません。私の興味は盛り上がり、いくつかのコードをまとめました。
私は特に「安全な」キャストに残っているとは心配していません。それがどのように始まり、デフォルト()で安全に保つことができるのですか?それは本当に安全性を確保するための質問とコードの焦点ではありません。
表現力に関しては、value.As<int>()
はもはや(int)value
より表現力がありません。しかし、なぜメソッドのユーザーは参照型でしか動作しないということを「ちょうど知っている」必要がありますか?私がそれを働かそうとするのは、表現力豊かな文章よりも、その方法の期待される振る舞いに関するものでした。
コードスニペットvalue.As<DateTime>()
は、「型 'System.DateTime'は汎用型またはメソッドでパラメータ 'T'として使用するために参照型でなければなりません。 。エラーメッセージから、参照型を必要とするため、上記のtopメソッドを使用することが解決されていることがわかります。
のC#のバージョンは何よりも使いやすくなって、どのように使っていますか? .NET 4では、2番目のオーバーロードが選択されます。 –
'object o = 42;のようなコードですか? var i = o.As(); 'これは構文エラーですか?または、それを与える正確なコードを表示できますか? –
svick
@ svickのコメントは、たとえば、DataRowのようなデータベース結果を使ってやっているかもしれないことを私の心にもたらします。その場合は、行のオブジェクト値を適切な型に変換するための拡張メソッドがすでに用意されています。 [.Field ](http://msdn.microsoft.com/en-us/library/bb360891.aspx) –