Реализация интерфейса generi c без указания параметра типа generi c в реализации - PullRequest
1 голос
/ 28 января 2020

Я хотел бы знать, могу ли я реализовать универсальный интерфейс c без указания параметров типа в типах реализации.

Например:

Допустим, у меня есть не * generic c интерфейс и универсальная c версия этого интерфейса, называемая IEnumItem. Реализующий класс должен реализовывать как generi c, так и non-generi c, но я не хочу указывать параметр типа T для этого класса, так как я хочу иметь возможность приводить его к различным реализациям этого универсальный c интерфейс. Реализации я пока не знаю. В этом случае у меня есть элемент enum, значение которого может быть преобразовано в различные типы enum. Значение перечисления 1 представляет «b» в ActualEnum1 и представляет «e» в ActualEnum2. Обе ситуации допустимы в моей ситуации.

В коде:

    public interface IEnumItem
    {
        int Value { get; }
    }

    public interface IEnumItem<T> : IEnumItem
        where T : struct, IConvertible
    {
        new T Value { get; }
    }

    /// <summary>
    /// Implementing class, 
    /// notice that no type parameter is specified in the class implementation
    /// </summary>
    public class EnumItem : 
        IEnumItem,
        IEnumItem<T>
        where T : struct, IConvertible
    {
        public int Value { get; private set; }

        T IEnumItem<T>.Value { get { return (T)(object)this.Value; } }

        public EnumItem(int value)
        {
            this.Value = value;
        }
    }

    public enum ActualEnum1
    {
        a, b, c,
    }

    public enum ActualEnum2
    {
        d, e, f,
    }

    public class UsageExample
    {
        public void Main ()
        {
            var item = new EnumItem(1);

            IEnumItem<ActualEnum1> itemAsEnum1 = (IEnumItem<ActualEnum1>)item;
            ActualEnum1 value1 = itemAsEnum1.Value; // should return 'b'

            IEnumItem<ActualEnum2> itemAsEnum2 = (IEnumItem<ActualEnum2>)item;
            ActualEnum2 value2 = itemAsEnum2.Value; // should return 'e'
        }
    }

Нечто подобное также возможно; реализуя это в классе:

        public T AsEnum<T>()
            where T : struct, IConvertible
        {
            return (T)(object)this.EnumValue;
        }

Но в идеале я хотел бы иметь возможность привести к типу IEnumItem <...>, как показано в примере, и получить значение таким способом. Если это невозможно, я в порядке с этим, но мне в основном любопытно.

Спасибо!

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