为了映射的目的,我想将一个Func<>传递到属性构造函数中,这样类似的事情就成为可能:
[Map<Foo>(foo=>foo.Name)]
public string Name { get; set; }我意识到属性必须是编译时常数,所以使用纯C#是不可能做到这一点的。
我想知道是否存在类似PostSharp的库来做类似的事情(从this post判断,我想有方法在纯IL中实现这一点)。
发布于 2016-08-08 17:24:10
不行。您需要C#中目前不支持的两种属性:
假设属性只是元数据,您不能期望在其使用过程中不运行任何东西(显然,属性构造函数可以运行您可能添加到其中的任何代码)。
虽然您所链接的其他问答提到直接发射IL时您应该能够做到这一点,但我也非常肯定,您可以避免为您的项目增加实现fluent 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));https://stackoverflow.com/questions/38835041
复制相似问题