es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Hay alguna manera de exigir simplemente que un objeto implemente los miembros de una interfaz sin exigir explícitamente que lo implemente en c#?

Estoy creando un control personalizado similar a un ItemsControl por lo que tiene una propiedad Items a la que deseo poder enlazar, pero para que mi control se actualice, la propiedad debe implementar INotifyCollectionChanged. Me gustaría que el usuario pudiera enlazar cualquier objeto siempre y cuando implemente tanto INotifyCollectionChanged como IList.

Aunque la solución simple es crear una nueva interfaz de lista así:
lang-cs
public interface INotifyCollectionChangedAndList : INotifyCollectionChanged, IList { }

y exigir que sea heredada en sus objetos de colección personalizados.

Sin embargo, en lugar de hacer esto, también deberían poder usar la ObservableCollection<T> estándar que hereda tanto INotifyCollectionChanged como IList, pero no hereda INotifyCollectionChangedAndList y no tengo realmente control sobre eso. Del mismo modo, si utilizan una biblioteca diferente con un tipo que no pueden controlar y que implementa las dos interfaces, debería funcionar igualmente.

Entonces mi pregunta es si hay alguna manera, fácil o de otro modo (por ejemplo, reflexión), donde pueda especificar que cualquier tipo utilizado debe implementar todos los requisitos de dos (o más) interfaces sin el explícito SomeClass : INotifyCollectionChangedAndList?

EDICIÓN

Creo que la respuesta es no. Por lo tanto, marcaré la respuesta de @benjamin como correcta porque, aunque puede que no sea la mejor para los autores de los controles, será lo más cercano a lo que me gustaría lograr de otro modo.

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Creación de un control personalizado con propiedad de elementos vinculables

    Si está creando un control personalizado similar a ItemsControl, es posible que desee tener una propiedad Items que se pueda vincular para actualizar el control. Sin embargo, para que su control se actualice, la propiedad debe implementar INotifyCollectionChanged.

    Para facilitar al usuario la vinculación de cualquier objeto siempre y cuando implemente tanto INotifyCollectionChanged como IList, puede crear una nueva lista de interfaz.

    Aquí hay un ejemplo de código para crear una lista de interfaz:

    public interface INotifyCollectionChangedAndList : INotifyCollectionChanged, IList { }
    

    El usuario puede heredar esto en sus objetos de colección personalizados para que su colección se pueda usar como elemento vinculable en su control personalizado. Usando este método, el usuario también puede usar ObservableCollection<t> estándar, que ya implementa tanto INotifyCollectionChanged como IList.

    Sin embargo, si el usuario usa una biblioteca diferente con un tipo que no puede controlar y el tipo implementa tanto INotifyCollectionChanged como IList, es posible que no funcione.

    Desafortunadamente, no hay otra forma de especificar que cualquier tipo utilizado debe implementar todos los requisitos de dos o más interfaces sin SomeClass : INotifyCollectionChangedAndList explícito.

    En general, aunque esta solución puede no ser la mejor para los autores de controles, es lo más cercano a lo que se puede lograr.

Comments are closed.