Как обойти: AmbiguousMatchException в Expression.Property (myNewExpression, "nameOfproperty") - PullRequest
2 голосов
/ 27 марта 2020

У меня есть класс, который выглядит примерно так:

public class MyClass {
    public string id { get; set; }
    public string Id { get; set; }
    public string SomethingMore {get; set;}
}

Я не контролирую класс. Поэтому мне приходится мириться с тем фактом, что существуют id (строчные буквы i) и Id (прописные буквы I). Нравится мне это или нет, я не могу изменить это, поэтому этот ответ отвечает на мои вопросы, почему, но не отвечает на мои вопросы с практическими рекомендациями.

В моем дереве выражений у меня есть:

var newExpression = Expression.New(typeof(MyClass).GetConstructor(Type.EmptyTypes))

var propertyExpression = Expression.Property(newExpression, "Id");

Во второй строке выдается Ambiguous Match Exception, потому что Expression.Property(..) не учитывает регистр - например, Expression.Property(newExpression, "SomethingMore") не не выдает исключение.

Какой тип работы вокруг вариантов у меня есть?

Следующий шаг в коде:

Expression.Assign(propertyExpression, Expression.Constant("someNewValue", typeof(string));

Мне не нужно присваивать значение свойству id, и я знаю значение id, которое является особенным , Однако мне нужно иметь возможность присвоить значение свойству Id.

Полагаю, я мог бы создать производную версию моего MyClass, которая не включает свойство id, но Мне нужно сделать это во время выполнения. Если это решение, как это можно сделать? Или, может быть, есть гораздо лучшее решение?

Я не контролирую MyClass. Я только знаю, что разработчик будет склонен определять и id и Id в своем классе.

1 Ответ

1 голос
/ 27 марта 2020

Существуют перегрузки для Expression.Property, которые позволяют более явные средства доступа к желаемому свойству.

Получите информацию о свойствах явно, используя отражение, и используйте это.

var type = typeof(MyClass);

var newExpression = Expression.New(type.GetConstructor(Type.EmptyTypes));

PropertyInfo property = type.GetProperty("Id");

var propertyExpression = Expression.Property(newExpression, property);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...