Поле, содержащее значения перечисления из разных перечислений - PullRequest
0 голосов
/ 18 июля 2011

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

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

public enum A { One, Two, Three }
public enum B { Four, Five, Six }

public abstract class FooBase
{
    object _enumVal;

    protected FooBase(object enumVal)
    {
        _enumVal = enumVal;
    }
}

public class Bar : FooBase
{
    public Bar(A enumVal):base(enumVal) {}
}

public class Bat : FooBase
{
    public Bat(B enumVal):base(enumVal) {}
}

1 Ответ

2 голосов
/ 18 июля 2011

Похоже, вы действительно хотите дженерики:

public enum A { One, Two, Three }
public enum B { Four, Five, Six }

public abstract class FooBase<T> where T : struct
{
    T _enumVal;

    protected FooBase(T enumVal)
    {
        _enumVal = enumVal;
    }
}

public class Bar : FooBase<A>
{
    public Bar(A enumVal):base(enumVal) {}
}

public class Bat : FooBase<B>
{
    public Bat(B enumVal):base(enumVal) {}
}

Вы не можете указать общее ограничение, так что T должно быть перечислением в обычном C #, но вы можете делать извращенные вещи для сгенерированного кода, чтобы выразить это ограничение в IL .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...