Я хочу реализовать выражение linq, которое позволит мне проверить свойство на предоставленном объекте - PullRequest
0 голосов
/ 17 октября 2018

Я хочу реализовать этот метод из MOQ.(Здесь немного не так)

    ISetup<T> Setup(Expression<Action<T>> expression);


    public class Foo {
        public string Bar { get; set; }
        public int Baz { get; set; }
    }

    public class MyCoolClass
    {
        public ?  Evaluate<Expression<Action>>(expression);
        //I want to be able to access and test the value of Foo.Bar (see below)
    }

    public class ClientOfMyClass
    {
        public void UseTheMethod()
        {
            MyCoolClass myCool = new MyCoolClass();
            bool result = myCool.Evaluate<Foo>(f => f.Bar);
        }
    }

По сути, я пытаюсь написать метод, который позволит вызывающей стороне указывать свойство объекта с выражением и позволяет проверить значениеэто свойство и что-то с ним делать.

1 Ответ

0 голосов
/ 17 октября 2018

Вы хотите использовать параметр Expression<Func<>> и убедиться, что он содержит Body и Member типа PropertyInfo, и использовать GetValue() для передачи вашего объекта.

public static void Evaluate<TObj,TProp>(
    this TObj obj, 
    Expression<Func<TObj, TProp>> expr)
{
    var prop = (expr.Body as MemberExpression)?.Member as PropertyInfo;
    var val = prop?.GetValue(obj);
    if (val != null) {
        //Do something
    }
}

Обратите внимание, что приведенный выше код требует, чтобы переданный в лямбда-код указывал на свойствоЕсли вы хотите обрабатывать поля, а также методы, они будут представлены как различные типы выражений, и вы захотите обрабатывать их немного по-разному.Для большего контекста и использования, вот скрипка .

Редактировать: Обновлено для работы с другими типами свойств.

...