Существует ли базовый объект для перечисления c #?

StackOverflow https://stackoverflow.com/questions/2063035

Вопрос

Я знаю, что вы не можете использовать наследование с перечислениями, поэтому в моем базовом классе я хочу определить, что классы, которые его реализуют, должны возвращать перечисление определенного типа для свойства.

В идеале, это было бы похоже:

public abstract BaseEnum MyEnum { get; set; }

Тогда все разработчики должны были бы возвращать некоторую форму перечисления.Но очевидно, что BaseEnum не существует.Я могу использовать object, но я бы предпочел этого не делать.

Есть ли хороший способ сделать это?

Редактировать: Я спрашиваю об этом, потому что я, по сути, хочу сохранить имя свойства в реализующих классах неизменным - я знаю, что не смогу работать с перечислением в базовом классе, но если бы я не поместил его в базовый, тогда реализующие классы могли бы сами определять имена свойств для своего перечисления, что со временем могло бы стать неясным, поскольку они дрейфовали бы в сторону своих собственных реализаций.

Это было полезно?

Решение

Самое близкое, что вы можете легко найти в C #, - это сделать тип универсальным с ограничением struct:

public abstract class BaseClass<T> where T : struct
{
    public abstract T MyEnum { get; set; }
}

тогда

public class DerivedClass : BaseClass<SomeEnum>

C # не позволит вам указать ограничение, ограничивающее вас перечисляемыми типами, даже несмотря на то, что CLI поддерживает его.У меня есть проект под названием Непринужденная Мелодия который использует приемы после сборки для обеспечения соблюдения такого ограничения - но я бы не советовал вам использовать тот же подход, если вы не чувствуете себя несколько смелее.Ограничение struct, по крайней мере, ограничит вас типами значений, что может быть достаточно хорошим.

Другие советы

Все перечисления наследуются от System.Enum.

Вам следует взглянуть сюда: Перечисление “Наследование”:

See section 8.5.2 of the CLI spec for the full details.
Relevant information from the spec

 * All enums must derive from System.Enum
 * Because of the above, all enums are value types and hence sealed
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top