Я реализую некоторый тип (MyType
в примере ниже), который имеет свойство Collection
.Внутри MyType
Мне все равно, что это за коллекция.Единственное, что меня волнует, это то, что он реализует IEnumerable<String>
и INotifyCollectionChanged
.Как мне реализовать свойство Collection
с этими ограничениями?
Вот что я попробовал:
Я создал новый интерфейс:
interface INotifyEnumerableCollectionChanged<T> : IEnumerable<T>, INotifyCollectionChanged {}
и сделалсвойство Collection
в MyType
типа INotifyEnumerableCollectionChanged<String>
.Кажется, это работает внутри MyType
.Похоже, я могу перечислить эту коллекцию и зарегистрировать событие CollectionChanged
.
Но я не могу установить это свойство для коллекции (MyCollection
в приведенном ниже примере), даже жесткие MyCollection
реализациии IEnumerable<String>
и INotifyCollectionChanged
.
Компилятор говорит:
Невозможно неявно преобразовать тип InterfaceInheranceTest.Program.MyCollection в InterfaceInheranceTest.Program.INotifyEnumerableCollectionChanged.Существует явное преобразование (вам не хватает приведения?)
Как правильно это сделать?
Вот полный пример кода:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Collections.Specialized;
namespace InterfaceInheranceTest
{
class Program
{
interface INotifyEnumerableCollectionChanged<T> : IEnumerable<T>, INotifyCollectionChanged {}
class MyCollection : IEnumerable<String>, INotifyCollectionChanged
{
IEnumerator<String> IEnumerable<String>.GetEnumerator()
{ throw new NotImplementedException(); }
System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
{ throw new NotImplementedException(); }
public event NotifyCollectionChangedEventHandler CollectionChanged;
}
class MyType
{
private INotifyEnumerableCollectionChanged<String> _Collection;
public INotifyEnumerableCollectionChanged<String> Collection
{
get { return _Collection; }
set
{
_Collection = value;
_Collection.CollectionChanged += new NotifyCollectionChangedEventHandler(_Collection_CollectionChanged);
foreach (var item in _Collection)
{
Console.WriteLine(item);
}
}
}
void _Collection_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
{ throw new NotImplementedException(); }
}
static void Main(string[] args)
{
var collection = new MyCollection();
var type = new MyType();
type.Collection = collection; // compiler doesn't like this!
}
}
}