C# - 将 lambda 传递给属性(方面)构造函数的库
C# - library to pass lambda into attribute (aspect) constructor
出于映射目的,我想将 Func<>
传递到属性构造函数中,以便这样的事情成为可能:
[Map<Foo>(foo=>foo.Name)]
public string Name { get; set; }
我意识到属性必须是编译时常量,所以用纯 C# 不可能做到这一点。
我想知道是否存在类似 PostSharp 的库来做类似的事情(根据 this post 判断,我想有一些方法可以在纯 IL 中实现它)。
没办法。您需要 C# 中当前属性不支持的两件事:
- 通用类型参数。
- 非常量参数。
认为属性只是元数据,您不能指望在使用过程中 运行 什么都没有(显然,属性构造函数可能 运行 您可以在其上添加任何代码)。
虽然您链接的其他问答提到您应该能够直接发出 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));
出于映射目的,我想将 Func<>
传递到属性构造函数中,以便这样的事情成为可能:
[Map<Foo>(foo=>foo.Name)]
public string Name { get; set; }
我意识到属性必须是编译时常量,所以用纯 C# 不可能做到这一点。
我想知道是否存在类似 PostSharp 的库来做类似的事情(根据 this post 判断,我想有一些方法可以在纯 IL 中实现它)。
没办法。您需要 C# 中当前属性不支持的两件事:
- 通用类型参数。
- 非常量参数。
认为属性只是元数据,您不能指望在使用过程中 运行 什么都没有(显然,属性构造函数可能 运行 您可以在其上添加任何代码)。
虽然您链接的其他问答提到您应该能够直接发出 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));