2010-11-22 11 views
5

Mi expresión no es buena y me gustaría mejorarla, así que me pregunto si alguien podría explicarme si es posible crear una propiedad en una clase a la que se le pueda dar un valor durante la instanciación como esta:Expresión <Func <TModel, TProperty >> como Propiedad para la inicialización de objetos?

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

o mejor aún (pero creo que estoy empujando)

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

con una clase algo como esto:

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

La idea básica detrás de esto es que creo una Cuadrícula a partir de un grupo de objetos Columna algo así.

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

Esto puede no ser la manera más ordenada/más fácil de hacer esto, pero yo estoy interesado en saber si se puede hacer como yo quiero mejorar mi comprensión de expresiones y me encanta ser capaz de tener valores inflexible en su lugar de literales de cadenas, es mucho mejor trabajar con ellos.

Cualquier pensamiento, ideas, divagaciones sería muy apreciada

Saludos Rob

Respuesta

7

Al definir algo como Func<TModel, TProperty> que significa que hay un método que toma un tipo TModel y devuelve un tipo TProperty. Entonces expresiones lambda como

p => p.ProductId 

devuelve el valor de la propiedad en lugar de la propiedad en sí.

Lo que puede hacer para hacer este trabajo es la sintaxis para definir su ColumnProperty de la siguiente manera:

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

A continuación, se puede extraer información detallada del árbol de expresión.

+0

Hey idursun - gracias esto también funciona - utilicé dinámico en lugar de objeto pero el resultado es el mismo – Rob

1

Ok, así que sólo tenía una idea genial y cambiado TProperty a dinámico y ahora puede hacer esto así que supongo que respondió a mi propia pregunta, pero sería interesado en otros pensamientos de la gente sobre las ventajas/desventajas de este enfoque:

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

de hecho

si cambio de propiedad a

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

yo sólo puedo hacer:

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

El enfoque de expresión es un enfoque decente. Creo que 'dinámico 'requiere un poco más de sobrecarga, pero puede tener un impacto insignificante. Un objeto dinámico mantiene un diccionario de miembros de objetos detrás de las escenas. – IAbstract

Cuestiones relacionadas