Приведение MemberExpression возвращает ноль, когда не должно - PullRequest
0 голосов
/ 27 октября 2018

У меня есть это (в проекте 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 голосов
/ 27 октября 2018

Проблема в том, что 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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...