将lambda传递给属性(方面)构造函数的库
本文关键字:方面 构造函数 属性 lambda | 更新日期: 2023-09-27 18:01:16
出于映射的目的,我想将Func<>
传递到属性构造函数中,这样就可以实现如下操作:
[Map<Foo>(foo=>foo.Name)]
public string Name { get; set; }
我意识到属性必须是编译时常数,所以在纯c#中不可能做到这一点。
我想知道是否存在类似postsharp的库来做类似的事情(从这篇文章来看,我猜有办法在纯IL中实现这一点)。
不行。
- 通用类型参数。
- 不恒定参数。
认为属性只是元数据,您不能期望在其使用期间什么都不运行(显然,属性构造函数可能会运行您添加的任何代码)。
虽然你链接的另一个问题提到,直接发射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));