出于映射目的,我想将Func<>
传递给属性构造函数,以便这样的事情成为可能:
[Map<Foo>(foo=>foo.Name)]
public string Name { get; set; }
我意识到属性必须是编译时常量,所以用纯C#做这个是不可能的。
我想知道是否存在任何类似PostSharp的库来做类似的事情(通过this post来判断我想有办法在纯IL中实现它。)
答案 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));