.NET Reflection

.NETにしろJavaにしろ、リフレクションを使うのは、あまり実行時の効率が良くないのだろうが、呼出回数が多くなければ、それほど気にならない。

私の場合、どんなときに使うかというと、クラスを特定しない、コンバーターライブラリなどに使用している。

例えば、CSVと定義ファイルから、クラスインスタンスにCSVの項目を動的にマッピングさせるライブラリなど。

以下のような感じで使用している。

<!--
	マッピング定義
	Column -- CSVカラム
		Index : カラム位置
		MapProperty : 設定するプロパティ名
		FuncName : 変換メソッド
-->
<Mapping OutputColumns="5">
  <Column Index="0" MapProperty="EmpNo" FuncName="ConvertEmpNo"/>
  <Column Index="1" MapProperty="ExecDate" />
	・・・
</Mapping>
/// <summary>
/// クラスインスタンスへの値セット(Reflection版)
/// </summary>
/// <param name="instance">インスタンス</param>
/// <param name="prop">プロパティ情報</param>
/// <param name="value">値</param>
/// <typeparam name="U">インスタンスの型</typeparam>
public static void SetProp<U>(U instance, string prop, object value) {
    var p = typeof(U).GetProperty(prop);
    if (p == null) {
        throw new ArgumentException($"クラス「{typeof(U).ToString()}」にはプロパティ{prop}が存在しません");
    }
    p!.SetValue(instance,value);
}

ちなみに、FuncNameのメソッドも同様にReflectionを使用して呼び出す。

他にExpressionを使用する方法もあるのだが、式をコンパイルした物をどこかに保存しない場合はReflectionの方がまだ効率が良いかなと・・・

まぁ、データ数がそれほど多くなければ実行速度はあまり気にならない程度。作りやすさや作成時間と実行時間とのトレードオフといったところかな。

takezou について

ソフトウェア開発会社(ITと言う言葉は大嫌い)で働く、元技術者。 未だに、社内システム位は作ってますが・・・ プログラミング言語はC#が好き。
カテゴリー: .NET, C#, 技術系 パーマリンク

コメントを残す

メールアドレスが公開されることはありません。

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください