Pregunta

Estoy IList unión a un GridView. IMyInterface parece

public interface IMyInterface: IHasTotalHours, IHasLines
{
    DateTime GoalStartDate { get; set; }
    DateTime GoalEndDate { get; set; }
}

Ato una instancia para una cuadrícula como esto:

IList<IMyInterface> instance= GetMyData();

myGrid.DataSource = instance;
myGrid.DataBind();

Cuando enlazar este a la red, los únicos miembros que se muestran en la cuadrícula son los miembros directos de IMyInterface:. GoalStartDate y GoalEndDate

¿Por qué? ¿Cómo consigo la cuadrícula para mostrar los miembros de las otras interfaces que hereda?

Actualizar Las interfaces heredadas definen propiedades de datos simples como

public interface IHasTotalHours
{
    string Description { get; set; }
    int Hours{ get; set; }
}
public interface IHasLines
{
    double TotalLines { get; set; }
    double LinesPerHour { get; set; }
}

Hay una clase que implementa IMyInterface:

public class MyClass : IMyInterface
{
    public string Description { get; set; }
    public int Hours { get; set; }
    public double TotalLines { get; set; }
    public double LinesPerHour { get; set; }
    public DateTime GoalStartDate { get; set; }
    public DateTime GoalEndDate { get; set; }

}

Estos se presentan como IMyInterface y devueltos en la lista que estoy unión al GridView.

¿Fue útil?

Solución

controles

Los datos con destino no utilizan la reflexión, sino un TypeDescriptor para obtener las propiedades de una fuente de datos. En el TypeDescriptor.GetProperties método, se puede leer lo siguiente:

  

Las propiedades de un componente puede   diferir de las propiedades de una clase,   debido a que el sitio puede agregar o quitar   propiedades si el componente está situada.

Al parecer, la implementación por defecto sólo devolverá propiedades directas de una interfaz y no las heredadas.

Por suerte este mecanismo es extensible, y se puede escribir una TypeConverter clase con la implementación información propiedad personalizada. Por favor refiérase a las observaciones en la documentación TypeConverter para implementar la lógica de la propiedad.

La aplicación GetProperties de la clase TypeConverter puede llamar TypeDescriptor.GetProperties (tipo) de su interfaz y todas sus interfaces de heredada. Pero tal vez incluso se podría escribir una TypeConverter genérico que encontraría todas las propiedades heredadas mediante el uso de la reflexión.

A continuación se adjunta este TypeConverter a su interfaz con el atributo TypeConverterAttribute.

Y entonces, como la magia, la fuente de datos encontrará todas las propiedades. ; -)

Otros consejos

Es porque una interfaz es un contrato, y esa es la única manera de interactuar con un objeto es a través de ese contrato específico. Las otras interfaces no pueden ser asumidos y no pueden ser utilizados hasta que se realice un yeso.

Así que cuando se enlaza un Listado de T para algo, la cuadrícula de datos no sabe nada de esas otras interfaces. Y la cuadrícula de datos no va a utilizar la reflexión para averiguar qué otras clases o interfaces podrían ser heredados. Las únicas propiedades de los objetos que van a estar disponibles para la cuadrícula de datos son las propiedades expuestas por la interfaz T.

Es necesario unir lista si desea que la cuadrícula de datos para tener acceso a todas las propiedades.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top