MemberExpression类型转换在不应该

时间:2018-10-27 16:51:38

标签: c# asp.net-mvc delegates

我有这个(在C#MVC项目中):

public class Bindable<TEntity> 
{
    //(...)
    public IHtmlString FormControlTextField<T>(string id, Expression<Func<TEntity, T>> member)
    {
        var prop = (member as MemberExpression).Member;
        var strLen = prop.GetCustomAttributes(typeof(StringLengthAttribute), false).OfType<StringLengthAttribute>().FirstOrDefault();
        //(...)
    }
//(...)
}

出于某种奇怪的原因,它在方法的第二行抛出NullReferenceException,因为它从第一行的类型转换返回null。

(从视图中)这样调用该方法:

@empresa.FormControlTextField(p => p.CNPJ, Model.CNPJ) 

@* "empresa" is an instance of Bindable<EmpresaCliente> *@
@* "CNPJ" is a property in EmpresaCliente *@

这有什么问题? 或者,是否有解决方法来测试“ p.CNPJ”的自定义属性?

1 个答案:

答案 0 :(得分:2)

问题在于Expression<Func<TEntity, T>>不是MemberExpression,而是LamdaExpression,这就是强制转换失败的原因。您真正想做的是改成member.Body。顺便说一句,您应该在代码中使用直接强制转换:

var prop = ((MemberExpression)member.Body).Member;

或更妙的是,进行检查:

var expression = member.Body as MemberExpression;
if(expression == null)
{
    throw new ArgumentException("Bad expression passed in!");
}
var prop = expression.Member;