型変数を使用して変数をキャストする 質問する

型変数を使用して変数をキャストする 質問する

C# では、 型の変数を、変数内で定義されている 型の変数にキャストできますobjectか?TTType

ベストアンサー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 somethinga something else適切なインターフェイスを使用すると、99.9% の場合は必要ありません。リフレクションに関しては、おそらく意味があるエッジ ケースがいくつかありますが、それらのケースは避けることをお勧めします。

編集2:

追加のヒント:

  • コードをできるだけ型安全に保つようにしてください。コンパイラが型を知らないと、コードが正しいかどうかをチェックできず、オートコンプリートなどの機能は動作しません。簡単に言うと、コンパイル時に型を予測できないのに、コンパイラはどうやって予測できるのでしょうか?
  • あなたが取り組んでいるクラスが共通インターフェースを実装する、そのインターフェースに値をキャストできます。それ以外の場合は、独自のインターフェースを作成し、クラスにそのインターフェースを実装することを検討してください。
  • 動的にインポートする外部ライブラリを使用している場合は、共通インターフェースも確認してください。それ以外の場合は、インターフェースを実装する小さなラッパー クラスの作成を検討してください。
  • オブジェクトを呼び出したいが、型を気にしない場合は、値をまたはに格納しますobjectdynamic変数。
  • ジェネリック関係する正確な型を知らなくても、さまざまな型に適用される再利用可能なコードを作成するための優れた方法です。
  • 行き詰まったら、別のアプローチやコードのリファクタリングを検討してください。コードは本当にそれほど動的である必要がありますか? 存在するすべての型を考慮する必要がありますか?

おすすめ記事