0

这是我的 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");
    }
} 

这是 EntityTypeConfiguration 的定义(属性配置只是示例)

ExampleTestOfDataTypesConfig config = new ExampleTestOfDataTypesConfig();

我需要遍历类 ExampleTestOfDataTypes 的所有属性,找到 dataTypes 派生自 Wrapper(BoolWrapper 是)的所有属性,然后使用 lambda 表达式获取这些属性。或者无论如何通过 config.Property(...) 选择它们

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]); //?
    }
}

谢谢

4

1 回答 1

2

更新

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

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

config.Property(lambda);

原始答案

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

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

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

于 2012-05-23T08:47:26.973 回答