[解決済み】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 something
を
a something else
実際の型を扱わずに 適切なインターフェイスを使えば、99.9%はその必要はないはずです。リフレクションに関しては、それが意味をなすかもしれないいくつかのエッジケースがあるかもしれませんが、私はそのようなケースを避けることをお勧めします。
編集2
いくつかの追加のヒント。
- できるだけ型安全なコードを心がけてください。コンパイラーは型がわからないと、コードが正しいかどうかをチェックできず、オートコンプリートなども機能しません。簡単に言うと コンパイル時に型が予測できなければ、コンパイラはどのようにして ?
- もし、作業しているクラスが 共通のインターフェイスを実装した の場合、その値をそのインターフェースにキャストすることができます。そうでない場合は、独自のインターフェイスを作成し、そのインターフェイスをクラスで実装することを検討してください。
- もし、動的にインポートする外部ライブラリを使っているのであれば、共通のインターフェースがあるかどうかもチェックしてください。そうでなければ、そのインターフェイスを実装した小さなラッパークラスを作成することを検討してください。
-
オブジェクトに対して呼び出しを行いたいが、型は気にしないのであれば、その値を
object
またはdynamic
変数を使用します。 - ジェネリック は、多くの異なる型に適用される再利用可能なコードを、関連する型を正確に知ることなく作成するための素晴らしい方法です。
- もし行き詰まったら、別のアプローチやコードのリファクタリングを検討してください。あなたのコードは本当にそんなにダイナミックでなければならないのでしょうか?どんな型にも対応しなければならないのでしょうか?
関連
-
[解決済み】文字列が有効な DateTime " format dd/MM/yyyy " として認識されなかった。
-
[解決済み】値をNULLにすることはできません。パラメータ名:source
-
[解決済み] enumを列挙するには
-
[解決済み] intをenumにキャストするにはどうすればよいですか?
-
[解決済み] ディープクローンオブジェクト
-
[解決済み] オブジェクトの種類を決定しますか?
-
[解決済み] C#がforeachで変数を再利用するのは理由があるのか?
-
[解決済み] 型チェック:typeof、GetType、is?
-
[解決済み] Pythonで型をチェックする標準的な方法は何ですか?
-
[解決済み] 変数が定義されているかどうかをチェックする?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】エラー。「戻り値を変更できません」 C#
-
[解決済み】指定されたキャストが有効でない?
-
[解決済み】文字列が有効な DateTime " format dd/MM/yyyy " として認識されなかった。
-
[解決済み】「入力文字列が正しい形式ではありませんでした」エラーの解決方法は?[重複しています]。
-
[解決済み】WPFでXamlファイルにコメントを追加する方法は?
-
[解決済み】C# - パスに不正な文字がある場合
-
[解決済み] [Solved] 不正な文字列値: '\xEFxBFxBD' for column
-
[解決済み】Moqを使用してメソッド呼び出しを検証する
-
[解決済み】 C# 条件演算子エラー 代入、call、increment、decrement、await、new object 式のみ文として使用可能です。
-
[解決済み】プロセスが実行されているかどうかを知るには?