2010-06-25 9 views
5

No estoy seguro si esto es posible, pero aquí es lo que estoy tratando de hacer:Paso de una propiedad en un método para cambiar esa propiedad

Quiero tener un diccionario que contiene una asignación de un índice de la columna a una nombre de propiedad utilizado para poblar ese índice.

En mi código voy a recorrer una matriz de cadenas y usar el diccionario para buscar a qué columna debe asignarse.

Mi código de resultado final sería el resultado:

for(int index = 0; index < fields.Length) 
{ 
    fieldPropertyMapping[index] = StripQuotes(fields[index]); 
} 
+0

Por cierto, sé que puedo hacer esto: mapeo var = new Dictionary > { {0, t => t.myProperty = StripQuotes (fields [0])} } Pero no me gusta esa solución –

+0

¿Puede decirnos * por qué * no le gusta esa solución? –

+0

No quiero poner la funcionalidad dentro del mapa, solo el concepto de "esta es la propiedad para operar en este índice". La lógica de cómo obtener el valor del campo se repetiría en cada entrada del diccionario con el ejemplo que di. –

Respuesta

6

Para hacer específicamente lo que estás preguntando, deberás usar el reflejo (mientras etiquetaste tu pregunta) para hacerlo. Eche un vistazo a la clase PropertyInfo. No estoy del todo seguro de lo que el código está haciendo, pero un ejemplo general de establecer un valor de propiedad reflexiva seria:

object targetInstance = ...; // your target instance 

PropertyInfo prop = targetInstance.GetType().GetProperty(propertyName); 

prop.SetValue(targetInstance, null, newValue); 

Podría, sin embargo, pasar una Action<T> lugar, si conoce la propiedad en algún momento en el código. Por ejemplo:

YourType targetInstance = ...; 

Action<PropertyType> prop = value => targetInstance.PropertyName = value; 

... // in your consuming code 

prop(newValue); 

O, si se conoce el tipo cuando lo llaman, pero no tiene la instancia, podría hacer que sea un Action<YourType, PropertyType>. Esto también evitaría crear un cierre.

Action<YourType, PropertyType> prop = (instance, value) => instance.PropertyName = value; 

... // in your consuming code 

prop(instance, newValue); 

Para que esto sea totalmente genérico ("genérico", como en "no específica", no como en los genéricos), es probable que tenga para que sea una Action<object> y echarlo al tipo de propiedad adecuada dentro de la lambda, pero esto debería funcionar de cualquier manera.

+0

Su segundo ejemplo fue exactamente lo que estaba buscando, gracias. Estaba bailando alrededor de esa solución, pero no pude obtenerla por alguna razón. –

2

Usted tiene un par de opciones:

  1. Uso reflexión. Almacene y pase un objeto PropertyInfo en el método y establezca su valor a través de la reflexión.
  2. Crea un ActionDelegate con un cierre a esa propiedad y pásalo al método.
+0

+1 para el enfoque de Acción. –

0

se puede utilizar la reflexión para obtener las propiedades de una clase:

var properties = obj.GetType().GetProperties(); 

foreach (var property in properties) 
{ 
    //read/write the property, here... do whatever you need 
} 
Cuestiones relacionadas