アノテーションからインスタンス作成
アノテーションからインスタンス作成
NUnitってTestのアノテーションからいろいろ作ってやってるから、リフレクション使えばできるのかなと思い付き、ちょっとやってみた。
やりたいこと
- 実行内容は外界から取ってくる(設定ファイルとかから)
- どこかの名前空間にあるコマンドクラス群を詰め込んである
- 実行の際に、必要に応じてそれらのインスタンスを作成
- けど、コマンドクラス増えるたびにインスタンスを生成・取得するところを修正するのは嫌
ということで、コマンドクラス群にアノテーションを振って、そのアノテーションを元に生成・取得する処理は作ってしまえばインザネと思ったのでちょっとやってみた。
var types = AppDomain.CurrentDomain.GetAssemblies()
.SelectMany(assem => assem.GetTypes()
.Select(t => t)
.Where(t => t.FullName.Contains("Namespace.Foo"))
.Where(t => Attribute.GetCustomAttributes(t, typeof(BarAttribute)).Length > 0)
.Select(t => t)
);
foreach(Type typ in types)
{
var instance = Activator.CreateInstance(typ);
}
大体こんな感じ
もっとうまいやり方や書き方がある気がするけど、まぁとりあえず良し。
やってることは、Bar属性がついてるクラスをアセンブリ内から探してきて、サンプルのだと、全部インスタンス化してる。
types.Whereとかで、文字列のコマンド名から、インスタンス化する感じ。
連載! とことん C#: 第 16 回 リフレクション (Reflection) を活用する
一応、この辺を参考にしてみた。