0

This is my POCO object:

public class ExampleTestOfDataTypes
{
    public float FloatProp { get; set; }
    public BoolWrapper BoolProp2 { get; set; }
}

This is configuration file of the POCO

public class ExampleTestOfDataTypesConfig : EntityTypeConfiguration<ExampleTestOfDataTypes>
{
    public ExampleTestOfDataTypesConfig()
    {    
         this.Property(x=>x.FloatProp).HasColumnName("CustomColumnName");
    }
} 

This is definition of EntityTypeConfiguration (the property configuration is just for example)

ExampleTestOfDataTypesConfig config = new ExampleTestOfDataTypesConfig();

I need to go through all the properties of class ExampleTestOfDataTypes, find all the properties which dataTypes are derived from Wrapper (BoolWrapper is) and then get these properties using lambda expression. Or anyhow select them by 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]); //?
    }
}

Thanks

4

1 に答える 1

2

アップデート

Property申し訳ありませんが、このメソッドが独自の実装ではないことに気づきませんでした。式を手動で作成する必要があるようです。これは機能するか、少なくとも十分に近いはずです。

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

config.Property(lambda);

元の回答

既存のPropertyメソッドは、Expressionコンパイル時の安全性を維持しながら、プロパティの名前を読み取るためにを使用している可能性が非常に高いようです。ほとんどの場合、このようなメソッドはリフレクションを使用してプロパティ名を文字列に引き出し、文字列名を使用してリフレクションを続行します(おそらく、Property文字列を受け入れる別のオーバーロードを呼び出すことによって)。

したがって、合理的なアプローチは、この他のオーバーロードを自分で呼び出すことです。コードにはすでにPropertyInfoプロパティ名を取得できる手元があるためです。

メソッドが1つしかない場合はProperty、2つの部分に分割してリファクタリングします。1つは名前をから引き出し、もう1Expressionつは名前で機能します。次に、コードから直接2番目を呼び出すことができます。

于 2012-05-23T08:47:26.973 に答える