将lambda传递给属性(方面)构造函数的库

本文关键字:方面 构造函数 属性 lambda | 更新日期: 2023-09-27 18:01:16

出于映射的目的,我想将Func<>传递到属性构造函数中,这样就可以实现如下操作:

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

我意识到属性必须是编译时常数,所以在纯c#中不可能做到这一点。

我想知道是否存在类似postsharp的库来做类似的事情(从这篇文章来看,我猜有办法在纯IL中实现这一点)。

将lambda传递给属性(方面)构造函数的库

不行。

  • 通用类型参数。
  • 不恒定参数。

认为属性只是元数据,您不能期望在其使用期间什么都不运行(显然,属性构造函数可能会运行您添加的任何代码)。

虽然你链接的另一个问题提到,直接发射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));