【问题标题】:Get name of enum and string value from an enum object of any enum type in c# [closed]从c#中任何枚举类型的枚举对象获取枚举名称和字符串值[关闭]
【发布时间】:2017-12-01 15:28:53
【问题描述】:

我已经尝试了一段时间来实现这一目标。 我似乎有一些类似的答案,但它对我不起作用。 我不是 C# 专家,所以请注意。 (我什至不知道这是否可能实现)

所有枚举都在同一个类中。 所有数字都是唯一的。

我的问题:

enum BAR
{
    A = 0,
    B = 1
{

enum FOO
{
    C = 2,
    D = 3
}

public static string GetEnumName(object o)
{
    // Need help here
}

public static string GetName(object o)
{
    // Need help here
}

使用示例:

GetEnumName(BAR.A); // 结果 = BAR

GetName(BAR.A); // 结果 = A

GetEnumName(FOO.C); // 结果 = FOO

GetName(FOO.C); // 结果 = C

【问题讨论】:

  • 如果 C# 中的所有对象都继承自某个东西,并且该东西有 .ToString() 方法
  • 这看起来像是家庭作业
  • 如果 .ToString() 工作我不知道如何让它适用于许多枚举类型。听起来像一个简单的问题,但我没有让它工作......
  • 所以你告诉我你使用了.ToString(),但它不起作用?我发现这非常很难相信。如果它不起作用,您必须告诉我们它为什么不起作用,以及任何适用的错误消息。

标签: c# enums


【解决方案1】:

您可以使用这些方法(使用Enum 作为参数类型而不是Object):

public static string GetEnumName(Enum input)
{
    return input.GetType().Name;
}

public static string GetName(Enum input)
{
    return Enum.GetName(input.GetType(), input);
}

【讨论】:

  • 如果我可以问,为什么Enum.GetName().ToString() 更受欢迎?
  • 所以我所要做的就是将对象交换给 Enum。太棒了!!!
  • @maccettura:好吧,我不知道有什么区别,但请看这里的源代码评论:referencesource.microsoft.com/#mscorlib/system/…
  • @GustavoBaiocchiCosta 你仍然可以轻松使用对象
  • @GustavoBaiocchiCosta,您不必将object 更改为Enum,如果输入参数仍然是object,上面的代码会正常工作,尽管类型安全性较低。
【解决方案2】:

GetName 方法太过分了:

FOO.C.ToString();

或者你有一个变量:

object o = FOO.C;
o.ToString();

结果会得到“C”。

对于GetEnumName,您可以使用:

FOO.C.GetType().Name;

object o = FOO.C;
o.GetType.Name;

最后,如果您的两种方法确实只适用于枚举值,则输入值不应为 object,而应为 Enum,以强制实施某种程度的类型安全。

public static string GetName(Enum value)

public static string GetEnumName(Enum value)

坦率地说,你花时间在 cmets 上争论而不只是尝试这些东西,这有点令人失望。

【讨论】:

  • 你怎么知道是FOO.C?你只有对象可以合作
  • 我不认为你理解我的问题伙伴
  • 在某些时候(即当您调用 GetName 时)您需要知道实际值。当您可以简单地将.ToString() 附加到值而不调用GetName 时,为什么还要创建GetName。除非,正如其中一位评论者所说,这是一个家庭作业项目。
  • 我理解你的问题就好了。我认为您不了解如何抽象概念。
  • 跟作业有什么关系。我在上班。如果我知道类型,那么我根本不需要这个。我想要一些适用于泛型类型的东西。因此,您发送该类的任何枚举,我可以从该对象中提取值。
【解决方案3】:
    Below code should give you some idea....
    static void Main(string[] args)
    {
        Console.WriteLine($"GetEnumName(FOO.D):{GetEnumName(FOO.D)}");
        Console.WriteLine($"GetName(FOO.D):{GetName(FOO.D)}");
        Console.Read();
    }

    public static string GetEnumName(object o)
    {
        // Need help here
        Type t = o.GetType();
        return t.Name;
    }

    public static string GetName(object o)
    {
        // Need help here
        return o.ToString();
    }

【讨论】:

  • 这也是一个非常好的答案。感谢您发帖队友:D
  • 没问题,如果你总是要传入参数,你应该使用 Enum 而不是 Object
【解决方案4】:

静态Enum 类有一个方法来获取给定Enum 类型和值的常量值的名称。请参阅相关的documentation here。但是,作为参考,它就像

一样简单
Enum.GetName(typeof(Foo), value);

当我不知道所使用的 Enum 的类型时(例如,当我使用泛型时),我会使用它。

要获得 Enum 的名称,您必须对类型进行一点反射。

typeof(value).toString()

【讨论】:

  • 谢谢伙计。我现在明白了,感谢您的帮助:D
【解决方案5】:
    public static string GetEnumName(object o)
    {
        if ( o is Enum)
            return o.GetType().Name;
        return null;
    }

    public static string GetName(object o)
    {
        if (o is Enum)
        {
            return Enum.GetName(o.GetType(), o);
        }

        return null;
    }

【讨论】:

  • 如果o 不是Foo 怎么办?您是否打算为每个可能的枚举提供一个案例?
  • @DStanley 对,我以为我们只有一个枚举,更新我的答案
  • 如果您要费心检查is Enum,为什么不直接将参数设为Enum...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-28
  • 1970-01-01
  • 1970-01-01
  • 2014-07-23
相关资源
最近更新 更多