Valuta il risultato del parametro all'interno dell'espressione >

asp.net-mvc c# expression-trees lambda linq

Domanda

Valuta il delegato

Ho un'espressione che uso un parametro con cui voglio usare il risultato della mia funzione DoSomething sotto.

public void DoSomething <TModel>(Expression<Func<TModel, String>> func){

}

Chiama il metodo DoSomething

Il seguente TModel ha una lista di nomi nella proprietà Names a cui vorrei accedere dal metodo DoSomething. Non riesco a capire come farlo.

DoSomething(m => m.Names);

Ho cercato di compilare senza molto successo

... 
func.Compile().Invoke([need m.Names]) in here. 

Il mio codice in realtà sembra qualcosa di simile

public static HelperResult TestFor<TModel>(
        ExtendedPageBaseClass<TModel> page,
    Expression<Func<TModel, object>> valueField,
    Expression<Func<TModel, object>> displayField,
    Expression<Func<TModel, ICollection>> list, 
        Object defaultValue = null, String changedEvent = null)   
{
    var idField = valueField.GetName();
    var label = displayField.GetName();
    var display = page.Html.NameFor(displayField).ToString();
    var data = list.Compile().Invoke(page.Html.ViewData.Model);
    return IsolatedSelectorFor(page, idField, display, label, data);
}

Risposta accettata

Hai definito l'espressione che passi al tuo metodo di m => m.Names . Tuttavia questa è solo una funzione che prende come input il tuo TModel e restituisce un elenco di nomi. Nota che a quel punto non hai ancora passato alcun oggetto. È solo una descrizione della funzione.

Pertanto, è necessario disporre di un'istanza del modello per passarla alla funzione e richiamarla. Qualcosa del genere funzionerebbe:

 public static void DoSomething<TModel>(Expression<Func<TModel, List<string>>> selectNamesFunc, TModel model)
 {
     var f = selectNamesFunc.Compile();
     var names = f.Invoke(model);
 }

L'utilizzo di questo metodo sarebbe:

DoSomething(m => m.Names, modelInstance);

Questo è solo un esempio di come usare, compilare e invocare da espressione. Devi decidere se qualcosa del genere ha senso e trova applicazione nel tuo dominio.


Risposta popolare

DoSomething, poiché è un Func , prenderà una funzione che contiene un singolo TModel e restituisce una singola stringa. Per invocare contro un elenco di nomi, come hai scritto, avrai bisogno del seguente sovraccarico

public void DoSomething<TModel>(Expression<Func<TModel, IEnumerable<string>>> func) ...

E poi passare sopra ogni stringa come risultato. Consiglio di utilizzare un metodo di supporto per gestire il lavoro sulle stringhe risultanti e chiamarlo da ciascuno dei sovraccarichi di DoSomething che utilizzano Funcs



Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché
Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché