以前に、ブログで書いた「C#でstringを一括でEmptyに初期化する」という記事でstringのプロパティに対して一括でstring.Emptyを設定する方法を紹介しましたが、今回は拡張メソッドを使用してObjectoクラスを拡張してstringクラスへ初期値として任意の値を設定できるようにしたいと思います。
使い方と実装方法
早速ですが、この方式で実装した場合の使用方法は以下の通りです。
public static void Main(string[] args) { Test test = new Test(); test.InitStringProps(); // ここでstring型のプロパティを一括で初期化する test.InitStringProps("test"); // 文字列を指定した場合この文字列が一括で設定される }
拡張メソッドの実装は以下の通りです。
/// <summary> /// 基底クラスに対する拡張メソッドを定義します。 /// </summary> public static class FundamentalExtensions { public static void InitStringProps(this object target, string initialValue = "") { MemberUtil.InitStringProps(target, initialValue); } }
ここで使用している「MemberUtil.InitStringProps(...)」ですが、以前紹介した「C#でstringを一括でEmptyに初期化する」を使用しているのでコードはそちらを参照してください。
実行結果の確認
上記メソッドの実行結果を確認します。
先ず、以下のような継承構造のあるクラスを作成します。
// 派生クラス public class Test : Base { public string Name_001 { get; set; } public string Name_002 { get; set; } public string Name_003 { get; set; } } // 基底クラス public class Base { public string Name_B_001 { get; set; } = "AAA"; // これだけ初期値を持っている public string Name_B_002 { get; set; } public string Name_B_003 { get; set; } }
上記クラスに対し冒頭の初期化メソッドを呼び出し結果を確認します。
public static void Main(string[] args) { var test = new Test(); test.InitStringProps(); PropertyInfo[] infoList = test.GetType().GetProperties(BindingFlags.Public | BindingFlags.Instance | BindingFlags.SetProperty); // 対象の列挙 foreach (PropertyInfo prop in infoList) { string str = prop.GetValue(test) as string; string ans = str == "" ? "Empty" : str; Console.WriteLine($"{prop.Name} = {ans}"); // 内容を確認する } } > [実行結果] > > Name_001 = Empty > Name_002 = Empty > Name_003 = Empty > Name_B_001 = AAA // ★既に何かある場合は無視する > Name_B_002 = Empty > Name_B_003 = Empty
以前紹介したMemberUtilにほとんど機能を依存していますが、nullになるはずのプロパティがstring.Emptyに初期化されたことが確認できました。
また、以下のように初期化の際に文字列を指定すると任意の値でnullになるプロパティが初期化できます。
var test = new Test(); test.InitStringProps("test"); > [実行結果] > > Name_001 = test > Name_002 = test > Name_003 = test > Name_B_001 = AAA > Name_B_002 = test > Name_B_003 = test