这是我的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]); //?
}
}
由于
答案 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
中拉出来,另一个用于名称;然后,您可以直接从您的代码中调用第二个。