У меня следующий интерфейс:
internal interface ITyped where EnumType : struct, Enum
{
public EnumType Type { get; }
// !!! this method must always return a subtype* of the implementing class
internal static Type TypeFromEnum(EnumType value) => throw new NotImplementedException();
}
Мне нужен метод TypeFromEnum, чтобы всегда возвращать тип, который является подтипом* реализующего класса. Есть ли способ записать это условие в коде, возможно, с каким-то ограничениемwhere ?
( *) Под «подтипом» я подразумеваю либо сам тип класса, либо настоящий дочерний тип, то есть что-то, что можно было бы зафиксировать, где Sub : Base, если Sub и Base были параметрами типа.
Пример использования: у меня есть группа классов с одноуровневой иерархией наследования
public class A { ... }
public class A1 : A { ... }
public class A2 : A { ... }
public class A3 : A { ... }
public abstract class B { ... }
public class B1 { ... }
public class B2 { ... }
и мне нужно (де)сериализовать их из/в json с помощью System.Text.Json. Чтобы сделать это возможным, A и B имеют свойство Type некоторого типа enum. Для десериализации у меня есть специальный преобразователь, который считывает содержимое записи этого типа как перечисление, а затем вызывает TypeFromEnum, чтобы определить, в какой тип следует десериализовать. Вот перечисления и соответствующее содержимое классов:
public enum AType { a, a1, a2, a3 }
public enum BType { b1, b2 }
public class A : ITyped
{
public AEnum Type { get; }
internal static Type TypeFromEnum(AEnum value)
{
switch (value)
{
case AType.a: return typeof(A);
case AType.a1: return typeof(A1);
case AType.a2: return typeof(A2);
case AType.a3: return typeof(A3);
default: throw new InvalidOperationException(); // should never be called
}
}
...
}
public abstract class B : ITyped
{
public BEnum Type { get; }
internal static Type TypeFromEnum(BEnum value)
{
switch (value)
{
case BType.b1: return typeof(B1);
case BType.b2: return typeof(B2);
default: throw new InvalidOperationException(); // should never be called
}
}
...
}
Подробнее здесь: https://stackoverflow.com/questions/786 ... pe-of-this