1. ホーム
  2. c#

[解決済み】Type変数を使った変数のキャスティング

2022-03-26 15:40:33

質問

C# では、以下のような型の変数をキャストすることができます。 object の変数に変換します。 T ここで T が定義されているのは Type という変数がありますか?

どのように解決するのですか?

ここでは、キャストとコンバートの例を示します。

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

いくつかの追加のヒント。

  • できるだけ型安全なコードを心がけてください。コンパイラーは型がわからないと、コードが正しいかどうかをチェックできず、オートコンプリートなども機能しません。簡単に言うと コンパイル時に型が予測できなければ、コンパイラはどのようにして ?
  • もし、作業しているクラスが 共通のインターフェイスを実装した の場合、その値をそのインターフェースにキャストすることができます。そうでない場合は、独自のインターフェイスを作成し、そのインターフェイスをクラスで実装することを検討してください。
  • もし、動的にインポートする外部ライブラリを使っているのであれば、共通のインターフェースがあるかどうかもチェックしてください。そうでなければ、そのインターフェイスを実装した小さなラッパークラスを作成することを検討してください。
  • オブジェクトに対して呼び出しを行いたいが、型は気にしないのであれば、その値を object または dynamic 変数を使用します。
  • ジェネリック は、多くの異なる型に適用される再利用可能なコードを、関連する型を正確に知ることなく作成するための素晴らしい方法です。
  • もし行き詰まったら、別のアプローチやコードのリファクタリングを検討してください。あなたのコードは本当にそんなにダイナミックでなければならないのでしょうか?どんな型にも対応しなければならないのでしょうか?