如果不应该,MemberExpression强制转换返回null

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如果不应该,MemberExpression强制转换返回null相关的知识,希望对你有一定的参考价值。

我有这个(在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”的自定义属性?

答案

问题是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;

以上是关于如果不应该,MemberExpression强制转换返回null的主要内容,如果未能解决你的问题,请参考以下文章

从 MemberExpression 中获取对象?

无法将“System.Linq.Expressions.UnaryExpression”类型的对象转换为“System.Linq.Expressions.MemberExpression”类型

如何将此树结构转换为 JS MemberExpression 树结构?

强制类型转换规则

java中怎样将object类型转换成int 型

Apache强制WWW跳转以及强制HTTPS加密跳转的方法