¿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.
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 propiedadItems
que se pueda vincular para actualizar el control. Sin embargo, para que su control se actualice, la propiedad debe implementarINotifyCollectionChanged
.Para facilitar al usuario la vinculación de cualquier objeto siempre y cuando implemente tanto
INotifyCollectionChanged
comoIList
, puede crear una nueva lista de interfaz.Aquí hay un ejemplo de código para crear una lista de interfaz:
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 tantoINotifyCollectionChanged
comoIList
.Sin embargo, si el usuario usa una biblioteca diferente con un tipo que no puede controlar y el tipo implementa tanto
INotifyCollectionChanged
comoIList
, 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.