C# - 将lambda传递给attribute(aspect)构造函数

时间:2016-08-08 17:16:26

标签: c# .net lambda attributes mapping

出于映射目的,我想将Func<>传递给属性构造函数,以便这样的事情成为可能:

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

我意识到属性必须是编译时常量,所以用纯C#做这个是不可能的。

我想知道是否存在任何类似PostSharp的库来做类似的事情(通过this post来判断我想有办法在纯IL中实现它。)

1 个答案:

答案 0 :(得分:1)

没办法。你想要两个目前属性在C#中不支持的东西:

  • 通用类型参数。
  • 非常数参数。

认为属性只是元数据,你不能期望在它的使用过程中不运行任何东西(很明显,属性构造函数可以运行你可能添加的任何代码)。

虽然你提到的另一个Q&amp; A链接提及直接发送IL应该可以做到,但我也非常确定你可以避免为实现流畅API的项目增加复杂性:

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

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

在配置阶段,您可以获得实现整个界面的所有类型,并实例化它们以获取每个界面的配置:

IEnumerable<IMappingConfigurator> configurators = Assembly.GetExecutingAssembly().GetTypes().Where
(
    t => t.GetInterfaces().Any(t => t == typeof(IMappingConfigurator))
).Select(t => (IMappingConfigurator)Activator.CreateInstance(t));