Wyrażenia lambda przekazywane, C# .NET MVC.

Wyrażenia lambda przekazywane, C# .NET MVC.
D7
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 89
0

Drodzy Koledzy,

mam drobny problem ze składnią. Mianowicie, mam funkcję o sygnaturze:

Kopiuj
public static HtmlString RegistryCryteriaGroupFor<TModel, TValue>(this HtmlHelper<TModel> htmlHelper, int colCount,
            params Expression<Func<TModel, TValue>>[] expressionList);

Chciałbym wywołać sobie tę funkcję w widoku, mam zadeklarowany @model. Problem może błahy, ale nie mogę ułożyć tablicy z wyrażeń lamda dla modelu. W jaki sposób powinno to poprawnie wyglądać?

Kopiuj
@Html.RegistryCryteriaGroupFor(2, m=>m.prop1, m=>m.prop2)

nie wchodzi.

Z góry dziękuję za wskazówki i pozdrawiam!

WeiXiao
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 5226
0

Dlaczego na widoku?

Dlaczego nie samo Func?

Dlaczego expression list, a jest params[]?

Kopiuj
public static void Function(List<Expression<Func<T, U>>> expressionList)
{

}

Przykład przekazania

Kopiuj
Function
(
    new List<Expression<Func<T, U>>>
    { x => x.prop1 coś, x => x.prop2 coś }
);

A jeżeli chcesz sprawdzić czy spełnia każdy warunek z tej listy to może trzeba to poskładać w jeden warunek, albo zrobić .All

D7
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 89
0
  1. Na widoku, bo funkcja z założenia ma być uniwersalna i chcę ją zastosować do różnych modeli w różnych widokach do wyświetlania róznych parametrów..
  2. Prawdę mówiąc nie bardzo widzę inną możliwość jeśli dalej w ciele funkcj iużywam EditorFor i przekazuję expression. Jeśli jest lepsza to chętnie zobaczę.
  3. Nazwa jest robocza, a chciałem params, bo to klasyczne podejście jeśli nie znam liczby przekazywanych parametrów.

Nie mogę wywołać tej funkcji na widoku w taki sposób jak podajesz, podkreśla moje odpowiedniki T i U na czerwono. Błąd CS0246, nie rozpoznaje nazwy T i U..

D7
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 89
0

Rzeczywiście, jak podałem typy wprost to przeszło :D Tylko nie do końca o to mi chodzi. Chciałbym to zrobić generycznie aby podać wiele lambd o różnych typach - bo różne typy mam w modelu. Chciałbym tak napisać sygnaturę funkcji aby wywołanie było podobne do tego:

Kopiuj
@Html.RegistryCryteriaGroupFor(2, m=>m.prop1, m=>m.prop2)

Sygnatura, którą podałem w pierwszym poście:

Kopiuj
public static HtmlString RegistryCryteriaGroupFor<TModel, TValue>(this HtmlHelper<TModel> htmlHelper, int colCount,
            params Expression<Func<TModel, TValue>>[] expressionList);

jest składniowo poprawna, nie wiem jednak w jaki sposób prawidłowo podać do niej parametry.

WeiXiao
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 5226
0

@dawid75_75:

Nie twierdzę, że była niepoprawna, ale na liście chyba wygodniej :P

A tak?

Kopiuj
new Expression<Func<TModel, TValue>>[] { x => x.prop1 coś, x => x.prop2 coś }
D7
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 89
0

Tak, przeszło dla paramsów i nawet wygenerowało to co chciałem, ale za TValue musiałem podać object, co mnie trochę boli :P Czemu muszę tak robić, skoro moja metoda jest generyczna?

WeiXiao
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 5226
0

@dawid75_75:

Jest generyczna, ale czy Ty chcesz chyba zrobić kolekcje dla wielu typów RÓŻNYCH tak?
np.

Expression<Func<A, B>>

i

Expression<Func<C, D>>

w 1 kolekcji?

Nie polecam, ale może params dynamic[]? lub ogólnie może twój koncept jest niekoniecznie najlepszy :P

D7
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 89
0

Rzeczywiście to był słaby pomysł. Rzuciło wyjątkiem przy wywołaniu EditorForModel.

somekind
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Wrocław
0

Jak dla mnie, to skoro potrzebujesz takich kombinacji, to znaczy, że za dużo logiki upychasz w widoku. Cokolwiek robisz powinieneś to robić w kontrolerach albo jeszcze gdzieś niżej.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.