Создать метод с неограниченными параметрами выражения? - PullRequest
1 голос
/ 25 августа 2011

Я создал метод репозитория со следующей подписью:

T Get<TProperty>(int id, Expression<Func<T, TProperty>> include)

Это прекрасно работает, но я хотел бы расширить его, чтобы принимать неограниченное количество включений.Я не могу просто использовать params, потому что каждое включение будет возвращать разные TProperty.

Есть ли хороший способ обойти это или мне нужно создать несколько перегрузок для 1, 2 или 3 включений, например?

Ответы [ 2 ]

1 голос
/ 25 августа 2011

Если типы TProperty могут отличаться, и если вы хотите сделать их разными, то вам потребуется несколько перегрузок.

T Get<TProperty>(int id, Expression<Func<T, TProperty>> include) { ... }
T Get<TProperty1, TProperty2>(int id, Expression<Func<T, TProperty1>> include1, Expression<Func<T, TProperty2>> include2)

ИЛИ вы можете использовать:

T Get(int id, params Expression<Func<T, object>>[] includes)

И полагаться на ковариацию универсального делегата Func, но тогда вам придется справиться с фактомвы теряете немного безопасности типов.

Поскольку Func является ковариацией по типу возвращаемого значения, это означает, что если ваш делегат ожидает возврата объекта, вы все равно можете передать ему делегат с более узким типом возврата (хотя и с предупреждением, с типами значений ковариантности ковариантно не совместимы с объектом, только ссылочные типы).

0 голосов
/ 25 августа 2011

Код, который вы опубликовали, не позволит вам вернуть другое свойство TProperty, а только тот тип, который вы укажете во время выполнения как <TProperty>

Вы можете использовать Params и использовать Object вместо универсального типа

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...