C# では、 型の変数を、変数内で定義されている 型の変数にキャストできますobject
か?T
T
Type
ベストアンサー1
キャストと変換の例を次に示します。
using System;
public T CastObject<T>(object input) {
return (T) input;
}
public T ConvertObject<T>(object input) {
return (T) Convert.ChangeType(input, typeof(T));
}
編集:
コメントの中には、この回答は質問の答えではないと言う人もいます。しかし、この行は(T) Convert.ChangeType(input, typeof(T))
解決策を示しています。このConvert.ChangeType
メソッドは、任意のオブジェクトを 2 番目の引数として指定された型に変換しようとします。
例えば:
Type intType = typeof(Int32);
object value1 = 1000.1;
// Variable value2 is now an int with a value of 1000, the compiler
// knows the exact type, it is safe to use and you will have autocomplete
int value2 = Convert.ChangeType(value1, intType);
// Variable value3 is now an int with a value of 1000, the compiler
// doesn't know the exact type so it will allow you to call any
// property or method on it, but will crash if it doesn't exist
dynamic value3 = Convert.ChangeType(value1, intType);
ジェネリックを使用して回答を記述したのは、実際の型を処理せずにキャストする場合、コード臭が発生する可能性が非常に高いと考えているためですa something
。a something else
適切なインターフェイスを使用すると、99.9% の場合は必要ありません。リフレクションに関しては、おそらく意味があるエッジ ケースがいくつかありますが、それらのケースは避けることをお勧めします。
編集2:
追加のヒント:
- コードをできるだけ型安全に保つようにしてください。コンパイラが型を知らないと、コードが正しいかどうかをチェックできず、オートコンプリートなどの機能は動作しません。簡単に言うと、コンパイル時に型を予測できないのに、コンパイラはどうやって予測できるのでしょうか?
- あなたが取り組んでいるクラスが共通インターフェースを実装する、そのインターフェースに値をキャストできます。それ以外の場合は、独自のインターフェースを作成し、クラスにそのインターフェースを実装することを検討してください。
- 動的にインポートする外部ライブラリを使用している場合は、共通インターフェースも確認してください。それ以外の場合は、インターフェースを実装する小さなラッパー クラスの作成を検討してください。
- オブジェクトを呼び出したいが、型を気にしない場合は、値をまたはに格納します
object
。dynamic
変数。 - ジェネリック関係する正確な型を知らなくても、さまざまな型に適用される再利用可能なコードを作成するための優れた方法です。
- 行き詰まったら、別のアプローチやコードのリファクタリングを検討してください。コードは本当にそれほど動的である必要がありますか? 存在するすべての型を考慮する必要がありますか?