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.
¿qué es current.GetType()? ¿Es el tipo que esperas? –
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
Debería funcionar: ¿puede actualizar la publicación con la información de current.GetType() y current.GetType(). GetProperties()? – carlosfigueira