0

コード:

foreach (PropertyInfo prop in typeof(SomeObject).GetProperties())
                {
                    if (Attribute.IsDefined(prop, typeof(SomeCustomAttribute)))
                    {
                        column.Expression(p => p.Name);
                    }
                }

SomeCustomAttributeデータ注釈が割り当てられている列を追加したいと思います。

手動のp.Nameの代わりにprop.Name(プロパティの名前)をプロパティとして使用するにはどうすればよいですか?

例えば..

...
column.Expression(p => prop.Name);
...

column.Expressionは

ITableColumn Expression<TProperty>(Expression<Func<TModel, TProperty>> expression)
4

1 に答える 1

2

次のタイプが定義されているとします。

interface ITableColumn { }
class SomeObject 
{
    public int MyProperty { get; set; }
}
class Column<TModel>
{
    public ITableColumn Expression<TProperty>(Expression<Func<TModel, TProperty>> expression)
    {
        // just a stub
        return null;
    }
}

Column.Expressionリフレクションを介して取得した単一のプロパティ を呼び出すには、最初にメンバー式を作成する必要があります。

    private static LambdaExpression MakeMemberExpression(PropertyInfo propertyInfo)
    {
        var instanceExpression = Expression.Parameter(propertyInfo.DeclaringType);
        return Expression.Lambda(Expression.MakeMemberAccess(instanceExpression, propertyInfo), instanceExpression);
    }

静的にわからない限り、TProperty強く型付けされたラムダ(Expression<Func<TModel, TProperty>>)を作成する必要はありません。それでは、それを呼び出しましょう。

        var property = typeof(SomeObject)
            .GetProperty("MyProperty");

        var columnType = typeof(Column<>)
            .MakeGenericType(typeof(SomeObject));

        var expressionMethod = columnType
            .GetMethod("Expression")
            .MakeGenericMethod(property.PropertyType);

        var expr = MakeMemberExpression(property);

        expressionMethod.Invoke(new Column<SomeObject>(), new[] { expr });

お役に立てれば。

于 2012-06-01T12:28:51.517 に答える