通过属性信息变量按 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]); //?
    }
}

谢谢

通过属性信息变量按 lambda 选择属性

更新

我没有注意到Property方法不是您自己的实现,抱歉。看起来您必须手动创建表达式。这应该有效,或者至少足够接近:

var parameter = Expression.Parameter(configPocoType);
var lambda = Expression.Lambda(
    Expression.MakeMemberAccess(parameter, property),
    parameter);
config.Property(lambda);

原答案

看起来您现有的 Property 方法很可能只是使用Expression来读取属性的名称,同时保持编译时的安全性。大多数情况下,此类方法使用反射将属性名称拉出到字符串中,然后继续使用字符串名称进行反射(可能通过调用接受字符串的另一个重载Property(。

因此,一种合理的方法是自己调用此其他重载,因为您的代码已经有一个PropertyInfo,您可以从中立即获取属性名称。

如果只有一个Property方法,请通过将其拆分为两部分来重构:一部分将名称从Expression中提取出来,另一部分使用名称;然后可以直接从代码中调用第二个方法。