0

代码:

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

我想添加分配了 SomeCustomAttribute 数据注释的列。

如何使用prop.Name(属性名称)作为属性而不是手动p.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静态的,你就不需要构建强类型的 lambda( 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 回答