通过属性信息变量按 lambda 选择属性
本文关键字:属性 lambda 选择 信息 变量 | 更新日期: 2023-09-27 18:34:57
这是我的POCO对象:
public class ExampleTestOfDataTypes
{
public float FloatProp { get; set; }
public BoolWrapper BoolProp2 { get; set; }
}
这是 POCO 的配置文件
public class ExampleTestOfDataTypesConfig : EntityTypeConfiguration<ExampleTestOfDataTypes>
{
public ExampleTestOfDataTypesConfig()
{
this.Property(x=>x.FloatProp).HasColumnName("CustomColumnName");
}
}
这是实体类型配置的定义(属性配置只是示例(
ExampleTestOfDataTypesConfig config = new ExampleTestOfDataTypesConfig();
我需要遍历类 ExampleTestOfDataType 的所有属性,找到数据类型派生自包装器(BoolWrapper 是(的所有属性,然后使用 lambda 表达式获取这些属性。或者无论如何通过配置选择它们。属性(...
Type configPocoType = config.GetType().BaseType.GetGenericArguments()[0];
var poco = Activator.CreateInstance(configPocoType);
foreach (System.Reflection.PropertyInfo property in poco.GetType().GetProperties())
{
if (property.PropertyType.BaseType!=null&&
property.PropertyType.BaseType == typeof(Wrapper)
)
{
//TODO: Set property
//config.Property(x=>x.[What here]); //?
}
}
谢谢
更新
我没有注意到Property
方法不是您自己的实现,抱歉。看起来您必须手动创建表达式。这应该有效,或者至少足够接近:
var parameter = Expression.Parameter(configPocoType);
var lambda = Expression.Lambda(
Expression.MakeMemberAccess(parameter, property),
parameter);
config.Property(lambda);
原答案
看起来您现有的 Property
方法很可能只是使用Expression
来读取属性的名称,同时保持编译时的安全性。大多数情况下,此类方法使用反射将属性名称拉出到字符串中,然后继续使用字符串名称进行反射(可能通过调用接受字符串的另一个重载Property
(。
因此,一种合理的方法是自己调用此其他重载,因为您的代码已经有一个PropertyInfo
,您可以从中立即获取属性名称。
如果只有一个Property
方法,请通过将其拆分为两部分来重构:一部分将名称从Expression
中提取出来,另一部分使用名称;然后可以直接从代码中调用第二个方法。