2016-08-08 2 views
0

私はこのような何かが可能となるように、属性のコンストラクタにFunc<>を渡すしたいと思います:のC# - マッピング目的のために属性にラムダを渡すためのライブラリ(アスペクト)コンストラクタ

[Map<Foo>(foo=>foo.Name)] 
public string Name { get; set; } 

私はそれを実現属性はコンパイル時定数でなければならないので、純粋なC#でこれを行うことは不可能です。

似たようなことをするPostSharpのようなライブラリが存在するのでしょうか(this postで判断してください)純粋なILでこれを実装する方法があると思います。

答えて

1

途中です。現在、属性ではC#でサポートされていない属性が2つ必要です。

  • 一般型のパラメータ。
  • 定数ではありません。

属性は単なるメタデータなので、その使用中に何も実行しないとは限りません(属性コンストラクタは、あなたが追加できるコードを実行することができます)。

あなたがリンクした他のQ & Aは直接あなたがそれを行うことができるはずILを発する、私はまた、あなたが流暢なAPIを実装するプロジェクトに複雑にすることを避けることができることをかなり確信していることに言及しながら:

public class A : IMappingConfigurator 
{ 
    public string Name { get; set; } 

    public void Configure(IMappingConfiguration config) 
    { 
      config.Map<Foo>(foo => foo.Name); 
    } 
} 

と構成段階で、あなたは全体のインターフェイスを実装するすべてのタイプを取得し、ちょうど各1の構成を得るためにそれらのインスタンスを作成することができます

IEnumerable<IMappingConfigurator> configurators = Assembly.GetExecutingAssembly().GetTypes().Where 
(
    t => t.GetInterfaces().Any(t => t == typeof(IMappingConfigurator)) 
).Select(t => (IMappingConfigurator)Activator.CreateInstance(t)); 
関連する問題