Я хотел бы знать, могу ли я реализовать универсальный интерфейс 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 <...>, как показано в примере, и получить значение таким способом. Если это невозможно, я в порядке с этим, но мне в основном любопытно.
Спасибо!