Получить свойство первого аргумента метода расширения с помощью лямбды?(x => x.please) - PullRequest
2 голосов
/ 04 февраля 2012

Я пытаюсь сделать это:

var order = new BuildingOrder(); //has a Sale property
var sale = order.ConfusinglyGet(() => order.Sale); //get value of order.Sale

Пока все, что я могу понять, это:

public static O ConfusinglyGet<O>(this object i, Expression<Func<O>> expression)
{
    return expression.Compile()();
}

Вернет ли это значение свойства?

В конечном итоге я хочу иметь возможность проверить, является ли i нулевым, и при желании вернуть new O() как

public static O FreemasonsOnly<I,O>(this I i, Expression<Func<O>> expression)
    where I : class,
    where O : class, new()
{
    return i != null ? expression.Compile()() : new O();
}

Ответы [ 2 ]

4 голосов
/ 04 февраля 2012

Вам не нужен дополнительный уровень косвенности с Expression, потому что вы не передаете выражение в своем примере: вы передаете простое Func<I,O>

Это должно работать для вас:

public static O FreemasonsOnly<I,O>(this I i, Func<I,O> f)
where I : class where O : class, new()
{
    return i != null ? f(i) : new O();
}
1 голос
/ 04 февраля 2012

То, что вы хотите, выглядит так:

public static O ConfusinglyGet<T, O>(this T i, Expression<Func<T, O>> expression) where O : class, new()
{
    return expression.Compile()(i) ?? new O();
}
...