Ограничить тип возвращаемого значения подтипом этогоC#

Место общения программистов C#
Ответить
Anonymous
 Ограничить тип возвращаемого значения подтипом этого

Сообщение Anonymous »

У меня следующий интерфейс:
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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»