У меня следующий интерфейс:
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
Ограничить тип возвращаемого значения подтипом этого ⇐ C#
Место общения программистов C#
-
Anonymous
1719227414
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, чтобы всегда возвращать тип, который является подтипом* реализующего класса. [b]Есть ли способ записать это условие в коде[/b], возможно, с каким-то ограничениемwhere [b]?[/b]
( *) Под «подтипом» я подразумеваю либо сам тип класса, либо настоящий дочерний тип, то есть что-то, что можно было бы зафиксировать, где 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
}
}
...
}
Подробнее здесь: [url]https://stackoverflow.com/questions/78661082/constrain-return-type-to-be-subtype-of-this[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия