Переопределение неуниверсального свойства интерфейса универсальным свойством - PullRequest
1 голос
/ 07 июля 2011

У меня есть два интерфейса, подобные следующему:

public interface IEntityViewModel<T> : IEntityViewModel where T : class, ICLEntity
{
    new T Entity { get; set; }
}

public interface IEntityViewModel
{        
    void LoadEntity(int primaryKey);
    bool? DialogResult { get; set; }
    ICLEntity Entity { get; set; }        
}

Когда я реализую класс, как я могу убедиться, что свойство Entity, которое появляется в классе, является универсальным T?Вот пример класса:

    public abstract class EntityConductor<T> : IEntityViewModel<T>
    where T : class, ICLEntity
    {
        public T Entity
        {
            get; set;
        }
    }

Компилятору требуется также добавить реализацию IEntityViewModel, например:

ICLEntity IEntityViewModel.Entity
    {
        get
        {
            return ActiveItem.Entity;
        }
        set
        {
            ActiveItem.Entity = value as T;
        }
    }

, но затем я получаю два свойства Entity в классе, которыйне то, что мне нужно.При реализации универсального интерфейса мне нужно, чтобы свойство Entity было типа T, а если не универсальное - типа ICLEntity.

Как это можно сделать?Я что-то упустил?Я использую .NET 4.0, может ли мне здесь помочь ковариация?

Спасибо!

1 Ответ

0 голосов
/ 07 июля 2011

Я не думаю, что это можно сделать. У вас уже есть лучшее, что вы можете сделать.

public abstract class EntityConductor<T> : IEntityViewModel<T>
    where T : class, ICLEntity
{
    public T Entity { get; set; }

    ICLEntity IEntityViewModel.Entity
    {
        get { return Entity; }
        set { Entity = (T)value; }
    }
}

Это должно гарантировать, что при работе с объектом IEntityViewModel вы можете использовать строго типизированное свойство, но если вы знаете, что это только объект IEntityViewModel, то вы будете использовать свойство со слабой типизацией. Дополнительных требований к хранилищу нет, поэтому я не вижу в этом проблемы. Эта конструкция отражает то, что кажется вашим сценарием использования - у вас есть объект, но в некоторых случаях у вас может не быть информации о типе, чтобы разрешить использование строго типизированного свойства.

В качестве идентификатора сеттер в IEntityViewModel.Entity должен выдать исключение, если параметр имеет неправильный тип.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...