我有这个(在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;