C#のリフレクションで文字列値を異なるデータ型のプロパティに設定する方法
リフレクションとは何か
リフレクションとは、マネージドコードが自分自身のメタデータを読み取り、アセンブリの情報を取得できる仕組みです。端的に言えば、同一システム内のコードが別のコードを調査・操作できるようにする機能です。C#のリフレクションを活用すると、型のインスタンスを動的に生成したり、その型を既存のオブジェクトにバインドしたりすることができます。さらに、既存のオブジェクトから型情報を取得し、そのプロパティへアクセスすることも可能です。コード内で属性(Attribute)を使用している場合も、リフレクションがモジュールやアセンブリ、型を記述するTypeオブジェクトを提供してくれるため、それらの情報にアクセスできます。
Convert.ChangeType()で文字列を目的の型へ変換する
ここで「double型のプロパティを持っているのに、実行時に手元にある値は文字列」という状況を考えてみましょう。この場合、文字列を適切な型に変換してからプロパティへ代入する必要があります。そんなときに役立つのが Convert.ChangeType() です。このメソッドは、IConvertibleインターフェイスを実装している任意の型に対して、ランタイムの型情報をもとに表現形式を変換することを可能にします。
コード例
using System;
using System.Reflection;
namespace DemoApplication{
class Program{
static void Main(){
// Circleクラスのインスタンスを生成
Circle circle = new Circle();
// 実行時に文字列として受け取った値
string value = "6.5";
// 「Radius」プロパティの情報を取得
PropertyInfo propertyInfo = circle.GetType().GetProperty("Radius");
// 文字列をプロパティの実際の型(double)に変換して設定
propertyInfo.SetValue(circle, Convert.ChangeType(value,
propertyInfo.PropertyType), null);
// 設定された値を読み取って表示
var radius = circle.GetType().GetProperty("Radius").GetValue(circle, null);
Console.WriteLine($"Radius: {radius}");
Console.ReadLine();
}
}
class Circle{
public double Radius { get; set; }
}
}実行結果
Radius: 6.5
上記の例では、文字列「6.5」がConvert.ChangeTypeによって実際のdouble型へ変換され、リフレクションを通じて実行時にRadiusプロパティへ正しく設定されていることが確認できます。この手法を使えば、設定ファイルやAPIレスポンスなどで文字列として受け取った値を、事前に型を固定することなく柔軟にオブジェクトへ反映できます。
押さえておきたいポイント
- Convert.ChangeType()は、int、double、DateTimeなどIConvertibleインターフェイスを実装している型でのみ利用できます。独自に定義したクラスには直接使用できません。
- 比較的新しい.NETのバージョンでは、SetValueの第3引数(インデックス配列)を省略できるオーバーロードが用意されています。
- 変換できない文字列(例:「abc」をdoubleへ変換)を渡すとFormatExceptionやInvalidCastExceptionがスローされるため、実運用ではtry-catchによる例外処理を組み合わせることをおすすめします。
-
TkinterのSpinboxでデフォルトの文字列値を設定する方法
TkinterのSpinbox(スピンボックス)にデフォルトの文字列値を設定するには、setメソッドを使用します。この記事では、複数の文字列値を持つスピンボックスを作成し、その中から特定の値をデフォルトとして設定する方法を、実際のコード例とともにわかりやすく解説します。 実装の手順 tkinterライブラリをインポートし、tkinterフレームのインスタンスを作成します。 geometryメソッドを使って、フレームのサイズを設定します。 文字列のリストを作成し、変数dataに保存します。 StringVar()コンストラクタを使ってStringVarオブジェクトを作成します。これにより、ウィ
-
Redis TYPEコマンドの使い方 – キーに格納された値のデータ型を取得する方法
このチュートリアルでは、Redisのキーに格納された値のデータ型を取得する方法について解説します。Redisのデータストアでは、値はString(文字列)、List(リスト)、Set(セット)、Sorted Set(ソート済みセット)、Hash(ハッシュ)など、さまざまなデータ型を持つことができます。値のデータ型を確認したい場合は、redis-cliでTYPEコマンドを使用します。 TYPEコマンドの構文 TYPEコマンドの基本的な構文は以下のとおりです。 redis host:port> TYPE <key name> 出力結果 TYPEコマンドを実行すると、次のいずれかの