C# MemberExpression强制转换在不应';T

C# MemberExpression强制转换在不应';T,c#,asp.net-mvc,delegates,C#,Asp.net Mvc,Delegates,我有这样一个(在一个C#MVC项目中): 公共类可绑定 { //(...) 公共IHtmlString FormControlTextField(字符串id,表达式成员) { var prop=(成员作为MemberExpression.member; var strLen=prop.GetCustomAttributes(typeof(StringLengthAttribute),false).OfType().FirstOrDefault(); //(...) } //(...) } 出于

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

公共类可绑定
{
//(...)
公共IHtmlString FormControlTextField(字符串id,表达式成员)
{
var prop=(成员作为MemberExpression.member;
var strLen=prop.GetCustomAttributes(typeof(StringLengthAttribute),false).OfType().FirstOrDefault();
//(...)
}
//(...)
}
出于某种奇怪的原因,它在方法的第二行抛出了一个NullReferenceException,因为它从第一行的强制转换返回null

方法的调用方式如下(从视图):

@empresa.FormControlTextField(p=>p.CNPJ,Model.CNPJ)
@*“empresa”是Bindable的一个实例*@
@*“CNPJ”是EMPRESACLIENT的财产*@
这有什么问题?
或者,是否有一种变通方法来测试“p.CNPJ”的自定义属性?

问题在于
表达式不是a,而是a,这就是强制转换失败的原因。您真正想做的是转换
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;

我想你可能想在这里使用
member.Body作为MemberExpression
。@DavidG,你说得对。我的错。。。你想把它贴出来作为答案,这样我就可以把它标记为正确的答案吗?@HimBromBeere对简历太草率了,我想,OP已经知道为什么会发生NRE了。@HimBromBeere,随你的便。但我的问题是不知道空异常是什么(当然,对于使用泛型和委托的人来说,这一点必须清楚)。这一切都是关于将表达式强制转换到MemberExpression类时发生这种情况的原因。(正如DavidG正确回答的那样)。既然@HimBromBeere没有回应,我将重新讨论这个问题并给出答案。通常情况下,这不是我喜欢做的事情,但我不满意,这本来应该结束的。
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;