按PropertyInfo变量按lambda选择属性

时间:2012-05-23 08:41:35

标签: c#

这是我的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类的所有属性,找到从Wrapper(BoolWrapper is)派生的dataTypes的所有属性,然后使用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]); //?
    }
}

由于

1 个答案:

答案 0 :(得分:2)

更新

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

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

config.Property(lambda);

原始答案

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

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

如果你只有一个Property方法,可以通过将它分成两部分来重构:一个将名称从Expression中拉出来,另一个用于名称;然后,您可以直接从您的代码中调用第二个。