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);
}
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.
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