特定のクラスをもとにプロパティと値を登録してインスタンスを作成するメソッドの学習
初学での学習では学ばなかったことですが、リフレクションという機能を使って実現できます
サンプルコード
まず、次のコードを見てください
目的はわかりますか?
string result = "Name,山田太郎";
Person person = MyClass.MyMethod<Person>(result);
string name = person.Name;
Console.WriteLine(name);
class Person
{
public string Name { get; set; }
}
このコードの目的は、文字列 result
の値を元に、新しい Person
オブジェクトを生成し、そのオブジェクトの Name
プロパティを取得し、それを標準出力に出力することです。
まず、文字列 result
には名前と値がカンマで区切られています。次に、MyClass.MyMethod<Person>(result)
を呼び出すことで、新しい Person
オブジェクトが生成されます。このオブジェクトには、文字列 result
に含まれている名前をプロパティ名として、値を設定することができます。
最後に、生成された Person
オブジェクトの Name
プロパティを取得し、それを標準出力に出力することで、名前が正常に取得できたことを確認することができます。
では、どのようなクラスやメソッドを記述すると実現できるのでしょうか
型パラメータを使っているので、その型からインスタンスを作ってくれるのがわかりますね
また、Personクラスの型以外を設定しても動作するように思えますね
using System.Reflection;
string personData = "Name,山田太郎";
Person person = MyClass.MyMethod<Person>(personData);
string name = person.Name;
Console.WriteLine(name);
class Person
{
public string Name { get; set; }
}
class MyClass
{
public static T MyMethod<T>(string input) where T : new()
{
string[] values = input.Split(',');
T obj = new T();
PropertyInfo propertyInfo = typeof(T).GetProperty(values[0]);
if (propertyInfo != null)
{
propertyInfo.SetValue(obj, values[1]);
}
return obj;
}
}
このコードは、MyClass
クラスに含まれている MyMethod
スタティックメソッドを示しています。このメソッドは、文字列 input
が与えられ、T
型の新しいオブジェクトを生成します。この T
型は、new()
制約があることを意味しています。これは、このタイプはデフォルトのコンストラクタを持っていることを保証するものです。
文字列 input
は、カンマで区切られているので、Split
メソッドを使用して文字列を分割します。分割された配列の最初の要素は、新しいオブジェクトのプロパティ名です。次に、typeof(T).GetProperty(values[0])
で、指定された名前のプロパティを取得します。もし、そのプロパティが存在する場合、SetValue
メソッドを使用して、プロパティに値を設定します。
最後に、生成されたオブジェクトが返されます。
各行コメントつき版
using System.Reflection;
// 名前と値がカンマで区切られた文字列を用意する
string personData = "Name,山田太郎";
// MyMethod メソッドを呼び出して Person オブジェクトを生成する
Person person = MyClass.MyMethod<Person>(personData);
// Person オブジェクトの Name プロパティを取得する
string name = person.Name;
// 取得した Name プロパティを標準出力する
Console.WriteLine(name);
// Person クラスを定義する
class Person
{
public string Name { get; set; }
}
// MyClass クラスを定義する
class MyClass
{
// ジェネリック型を引数に取り、名前と値からオブジェクトを生成するメソッドを定義する
public static T MyMethod<T>(string input) where T : new()
{
// 入力文字列をカンマで分割する
string[] values = input.Split(',');
// T 型のオブジェクトを生成する
T obj = new T();
// T 型からプロパティを取得する
PropertyInfo propertyInfo = typeof(T).GetProperty(values[0]);
// プロパティが存在する場合
if (propertyInfo != null)
{
// プロパティに値を設定する
propertyInfo.SetValue(obj, values[1]);
}
// 生成したオブジェクトを返す
return obj;
}
}
使っているデザインパターンは
このコードには、Reflection を使った動的プロパティ値の設定を行う Factory Method パターンが使われています。
ディスカッション
コメント一覧
まだ、コメントがありません