Cosa significa: ExpressionFuncTModel, TValue

7

In ASP.Net MVC, nella vista del rasoio, puoi digitare questo tipo di codice:

@Html.EditorFor(model => model.Name)

(in questo caso, crea una casella di testo per il campo Nome dell'oggetto che è definito come il tipo del modello)

Ora quando vedo la definizione del metodo EditorFor, è questo:

EditorFor<TModel, TValue>(this HtmlHelper<TModel> html, Expression<Func<TModel, TValue>> expression);

Quindi ho provato a implementare quel tipo di metodo da solo, ma davvero non vedo cosa significhi Expression<Func<TModel, TValue>>

Chi può spiegarmi che cos'è un'espressione, e Func, e l'espressione di tipo Func?

Le spiegazioni ho trovato dove tutto così astratto non mi dava un indizio ....

    
posta Michel 16.01.2013 - 09:45
fonte

4 risposte

7

La Expression<T> classe:

Represents a strongly typed lambda expression as a data structure in the form of an expression tree.

E :

The System.Linq.Expressions namespace contains classes, interfaces and enumerations that enable language-level code expressions to be represented as objects in the form of expression trees.

The abstract class Expression provides the root of a class hierarchy used to model expression trees.

The classes in this namespace that derive from Expression, for example MemberExpression and ParameterExpression, are used to represent nodes in an expression tree. The Expression class contains static (Shared in Visual Basic) factory methods to create expression tree nodes of the various types.

The enumeration type ExpressionType specifies the unique node types.

Func<TResult> (e famiglia) di delegati:

You can use this delegate to represent a method that can be passed as a parameter without explicitly declaring a custom delegate. The encapsulated method must correspond to the method signature that is defined by this delegate.

La famiglia incapsula sostanzialmente i delegati per le funzioni che hanno un valore di ritorno.

Nel loro insieme, queste sono espressioni che prendono func delegati digitati prendono un parametro del tipo di modello e restituiscono qualsiasi valore restituito da lambda.

    
risposta data 16.01.2013 - 09:52
fonte
3

Expression è una classe che ti consente di prendere un'espressione lambda e trasformarla in un albero di sintassi. Viene utilizzato da Linq (ad esempio) per convertire le query Linq in query SQL effettive. È altamente estensibile in modo che tu possa fare altre cose con esso.

link

Dai un'occhiata al link se non hai familiarità con gli AST.

    
risposta data 16.01.2013 - 10:38
fonte
2

Gli helper HTML usano un trucco che è stato chiamato "Riflessione statica" che è stato portato nel framework .NET per supportare LINQ su SQL e Entity Framework. Fondamentalmente, l'espressione cattura una lambda che viene verificata in fase di compilazione (da cui lo statico) in un albero sintattico. L'albero può essere calpestato e può dare cose come il nome del membro a cui fa riferimento il corpo del lambda.

Essenzialmente, è una soluzione per la mancanza di una parola chiave "simbolo" da parte di .NET come il supporto di altre lingue.

    
risposta data 16.01.2013 - 14:33
fonte
2

In questo specifico esempio, l'HTML generato ha il seguente aspetto:

<input class="text-box single-line" id="Name" name="Name" type="text" value="ActualName" />

Se il parametro era solo un Func , potresti ottenere il valore ActualName , ma non il nome della proprietà a cui stai accedendo ( Name ). Quindi, per ottenere quel nome, ne avresti bisogno come parametro string (ad esempio qualcosa come @Html.EditorFor(model => model.Name, "Name") ).

Questo non è bello, perché significa che devi inserire il nome della proprietà due volte. Peggio ancora, si perde la sicurezza in fase di compilazione: se il nome della proprietà cambia, non si otterrà un errore sul secondo parametro.

    
risposta data 16.01.2013 - 14:53
fonte

Leggi altre domande sui tag