2010-11-22 37 views
5

Mes expressions ne sont pas géniales et j'aimerais les améliorer donc je me demande si quelqu'un pourrait expliquer pour moi s'il est possible de créer une propriété dans une classe qui peut recevoir une valeur comme instanciation:Expression <Func <TModel, TProperty >> as Propriété pour l'initialisation de l'objet?

new Column<Product>{ ColumnProperty = p => p.Title}; 

ou mieux encore (mais je pense que je poussais il)

new Column {ColumnProperty = p => p.Title}; 

avec quelque chose de classe comme ceci:

public class Column<TModel> 
{ 
     public Expression<Func<TModel, TProperty>> ColumnProperty { get; set; } 
} 

L'idée de base derrière cela est que je crée une grille à partir d'un tas d'objets Colonne quelque chose comme ça.

List<Product> productList = GetProductsFromDb(); 
List<Column> columnList = new List<Column>(); 

columnList.Add(new Column<Product> {ColumnProperty = p => p.ProductId, Heading = "Product Id"}); 
columnList.Add(new Column<Product> {ColumnProperty = p => p.Title, Heading = "Title"}); 

Grid myGrid = new Grid(productList, columnList); 

Cela peut ne pas être la façon de le faire tidiest/plus facile mais je suis intéressé à savoir si cela peut être fait que je veux améliorer ma compréhension des expressions et j'aime être en mesure d'avoir des valeurs fortement typées au lieu des littéraux de chaîne c'est tellement plus agréable de travailler avec.

Toutes les pensées, les idées, les divagations seraient grandement appréciés

Vive Rob

Répondre

7

Lorsque vous définissez quelque chose comme Func<TModel, TProperty> cela signifie qu'il ya une méthode qui prend un type TModel et retourne un type de TProperty. expressions lambda Donc comme

p => p.ProductId 

renvoie la valeur de la propriété plutôt que la propriété elle-même.

Qu'est-ce que vous pouvez faire pour faire ce travail de syntaxe est de définir votre ColumnProperty comme suit:

public Expression<Func<TModel, object>> ColumnProperty { get; set; } 

Ensuite, vous pouvez extraire des informations détaillées de l'arbre d'expression.

+0

Hey idursun - merci cela fonctionne aussi - j'ai utilisé dynamique au lieu de l'objet mais le résultat est le même – Rob

1

Ok donc je viens d'avoir un encéphalogramme et changé TProperty à dynamique et je peux maintenant faire, je pense que oui je répondu à ma propre question, mais serait vif sur d'autres peuples réflexions sur les avantages/inconvénients de cette approche:

foreach(Product p in productList) 
{ 
    var value = column.ColumnProperty.Compile().Invoke(p); 
} 

En fait

si je change ma propriété à

public Func<TModel, dynamic> ColumnProperty { get; set; } 

je peux faire:

foreach(Product p in productList) 
{ 
    var value = column.ColumnProperty(p); 
} 
+0

L'approche d'expression est une approche décente. Je pense que 'dynamic' nécessite un peu plus de frais généraux mais pourrait avoir un impact négligeable. Un objet dynamique maintient un dictionnaire des membres de l'objet dans les coulisses. – IAbstract