2011-07-14 18 views
6

Tengo un método que debe devolver los identificadores de una lista. Normalmente usaría la reflexión para esta tarea (no puedo usar un método genérico ya que las clases suelen ser POCOS que no comparten una interfaz o una clase base y no puedo modificarlas). Sin embargo, pensé en la nueva palabra clave dynamic y quería probar esto.Uso del método dinámico C# para un objeto

Sin embargo, mi problema es que dataSource [index] devuelve un objeto. Bien, en tiempo de ejecución, se garantiza que el objeto en cuestión esté en mis propias clases y que tenga una propiedad de identificación. pero supongo que debido a que el método devuelve un objeto, aparece un RumtineBinderException en tiempo de ejecución mientras se accede a current.id

public List<int> GetItemIds() 
{ 

    var result = new List<int>(); 
    var dataSource = GetDataSource(); // returns an List<Object> 

    for (int i = 0; i <= dataSource.Count - 1; i++) 
    { 
     dynamic current = dataSource[i]; 
     int id = current.Id; // throws RuntimeBinderException: Object has no definition for id 
    } 

    return result; 
} 

¿Hay una manera de achive lo que quiero o tengo que volver a la reflexión para obtener la propiedad id ?

Actualización:

current.GetType() returns object 
current.GetType().GetProperties() returns a TargetInvocationException 

Mi Pocos viven en mi proyecto principal (VB.net) pero este método está en una libary clase, tal vez esa es la causa. Sin embargo:

object current = dataSource[i]; 
PropertyInfo prop = current.GetType().GetProperty("id", BindingFlags.Public | BindingFlags.Instance | BindingFlags.IgnoreCase); 
if (prop != null) 
{ 
    int id = (int)prop.GetValue(current, null); 
} 

funciona.

+0

¿qué es current.GetType()? ¿Es el tipo que esperas? –

+0

Aquí hay algo mal ... usar dinámico en el ejemplo anterior debería hacerlo funcionar si el tipo de tiempo de ejecución tiene una propiedad Id ... – Jeff

+0

Debería funcionar: ¿puede actualizar la publicación con la información de current.GetType() y current.GetType(). GetProperties()? – carlosfigueira

Respuesta

1

Creo que puede necesitar definir el tipo de retorno de "GetDataSource()" como "List<dynamic>".

Por supuesto, como se indica en los comentarios, los objetos deben tener la propiedad "id" definida.

+0

Aunque supongo que no rompería nada por 'GetDataSource() como List ' porque técnicamente se compila en la Lista con comprobación de tipos, simplemente luce mal porque las listas no son covariantes porque no se puede hacer lo mismo por ejemplo si List fue devuelto. De cualquier forma, no es la solución porque todavía le está diciendo al compilador que trate el objeto devuelto del índice como dinámico, por lo que no debería haber diferencia. – jbtule

1

C# distingue entre mayúsculas y minúsculas, incluso cuando utiliza la palabra clave dinámica. su llamada es int id = current.Id; pero usted habla de que la propiedad es una ID en minúscula, y su llamada de reflexión no se distingue entre mayúsculas y minúsculas. La palabra clave dinámica no debería tener problemas para invocar propiedades de instancias públicas incluso a través de límites de ensamblaje, ya que dice que el método no se encuentra; lo mejor es que necesita estar usando int id = current.id;

+0

En mi aplicación del mundo real, la propiedad es minúscula y utilicé'actual.id' para acceder a ella. (Pero lo mezclé en el código de ejemplo). Sin embargo, incluso si veo la propiedad en la ventana de observación accediendo a ella por código failes. –

Cuestiones relacionadas