首页 > 解决方案 > 如何在实际类中引用枚举而不是 C# 中的基类

问题描述

我遇到了麻烦,因为我也很难正确地制定它。让谷歌搜索变得更加困难。我会尽量解释清楚。我已经简化了代码,以便更清楚我的问题是什么

我有一个抽象类,它具有所有以此为基类的类使用的方法和属性:

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 的枚举?我尝试了一些不同的东西,但似乎没有用。我认为的问题是枚举不是我可以从对象调用的属性或方法,而是需要调用ClassName.MyEnum,我在方法中没有className。

一种解决方案可能是为每个类类型创建一个方法,并将该特定的类类型作为参数,但这似乎有很多重复的代码。

例如,如果我有 50 个不同的派生类,例如 SpecializedClass

标签: c#inheritanceenumsabstract-class

解决方案


我认为反射是你唯一的选择。

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


推荐阅读