Как ссылаться на перечисление в реальном классе, а не на базовый класс в C # - PullRequest
0 голосов
/ 04 сентября 2018

У меня проблемы с этим, так как у меня тоже есть трудности с правильной формулировкой. Это усложняет поиск в Google. Я постараюсь объяснить как можно более четко. Я упростил код, чтобы было понятнее, что мой вопрос

У меня есть абстрактный класс, который имеет методы и свойства, которые используются всеми предложениями, которые имеют этот базовый класс:

public abstract class TheBaseClass{

    //some properties here

    public enum MyEnum{} // this one every class has. It is pretty much empty here. Not sure if this is best practice.

    //some methods here
}

Тогда есть ряд классов, основанных на этом:

public SpecializedClass : TheBaseClass{

    //some more properties here

    public new enum MyEnum{} //every single class has a different enum

    //some more methods here
}

Теперь, где-то еще в коде, у меня есть метод

public void MyMethod(TheBaseClass baseclassobject){

    //do stuff
    var usedforsomething = ((TheBaseClass.MyEnum)i).ToString() //i being an int. This is used to name something in a plot.
    //do more stuff
}

Причина использования TheBaseClass в качестве параметра для метода заключается в том, что раньше у меня был очень длинный код, который делал то, что делал mymethod для каждого класса, производного от TheBaseClass. Не хорошо иметь дублирующийся код, поэтому я сделал этот метод вместо этого и хотел вызвать его с параметром SpecializedClass (и многими другими классами также). Проблема в том, что при вызове TheBaseClass.MyEnum я, естественно, получаю перечисление для BaseClass, а не от SpecializedClass. Я экспериментировал с тем, как получить правильное перечисление в методе, независимо от того, какой базовый класс я ему даю, но, похоже, не могу найти решение.

Как я могу получить перечисление любого класса baseclassobject? Я пробовал разные вещи, но, похоже, не работает. Проблема, которую я считаю, состоит в том, что enum не является свойством или методом, который я могу вызвать из объекта, а скорее должен вызвать ClassName.MyEnum, которого в методе нет className.

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

Например, если у меня есть 50 различных производных классов, таких как SpecializedClass

Ответы [ 2 ]

0 голосов
/ 04 сентября 2018

Я думаю, что рефлексия будет для вас единственным вариантом.

var usedforsomething = 
      baseclassobject
       .GetType()
       .GetNestedType(nameof(TheBaseClass.MyEnum))
       .GetEnumName(i);

Но, возможно, лучшим решением было бы добавить абстрактную функцию GetName в базовый класс, которую ваши дочерние классы должны переопределить.

public abstract class TheBaseClass
{

    public enum MyEnum {a,b }

    public abstract string GetName(int value);
}

public class SpecializedClass : TheBaseClass
{

    public new enum MyEnum {c,d }

    public override string GetName(int value)
    {
        return ((MyEnum)value).ToString();
    }
}

Вы могли бы, чем сделать:

var usedforsomething = baseclassobject.GetName(i);

Вы можете избежать рефлексии, а также зависимости от дочерних классов, объявляющих перечисление с конкретным именем MyEnum.

0 голосов
/ 04 сентября 2018

Возможно, я вас неправильно понял, но вы пытались сделать небольшие размышления в MyMethod, чтобы получить необходимый тип перечисления:

public static void MyMethod(TheBaseClass baseclassobject)
{
    Type enumType = baseclassobject.GetType().GetNestedType("MyEnum");
    var usedforsomething = Enum.GetName(enumType, 1);
    Console.WriteLine(usedforsomething);
}
...