在实现中不指定泛型类型参数的情况下实现泛型接口

时间:2020-01-28 11:02:24

标签: c# generics interface

我想知道我是否可以实现通用接口而无需在实现类型中指定类型参数。

例如:

比方说,我有一个非通用接口和该接口的通用版本,称为IEnumItem。实现类应该同时实现泛型和非泛型,但是我不想为此类指定类型参数T,因为我希望能够将其转换为该泛型接口的不同实现。我尚不知道的实现。在这种情况下,我有一个枚举项目,其值可以转换为不同种类的枚举。枚举值1在ActualEnum1中表示'b',在ActualEnum2中表示'e'。两种情况在我的情况下都是有效的。

在代码中:

    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 <...>”并以这种方式获取值。如果无法做到这一点,我可以接受,但是我主要是很好奇。

谢谢!

0 个答案:

没有答案