在C#中使用Enum作为属性类

时间:2014-01-27 14:21:22

标签: c# enums

我是C#的新手,我想要实现的目标是。

我有一个带有Type属性的Action类,它接受以下值之一:Button或Link:

public class Action
{
    public ActionType Type { get; set; }

}


public enum ActionType
{
    Button,
    Link
} 

我正在使用WebAPI,现在我使用以下模拟列表来检查返回的数据

private static IList<Alert> alerts = new List<Alert>()
{
    new Alert()
    {
        Description = "You have cancelled your subscription",
        Actions = new Action[]
        {
            new Action()
            {
                Type = ActionType.Button
            }
        }

    }
};

当我在浏览器中测试时,我得到了

"Actions": [

    {
        "Type": 0
    }

]

我想要实现的是type属性的返回值“button”或“link”。我尝试在这里定义ActionType:

public enum ActionType
{
    Button = "button",
    Link   = "link"
}

但我收到以下错误“无法将类型'string'隐式转换为'int'。

如何修复上述错误?

4 个答案:

答案 0 :(得分:1)

您需要使用自己的JSON序列化,例如使用Json.net,它具有该属性。看看这个:

class Example
{
  [JsonConverter(typeof(StringEnumConverter))]
  public ActionType ActionType { get; set; }
}

var serializedObject = JsonConvert.SerializeObject(new Example(), Formatting.Indented);

答案 1 :(得分:1)

您可以将枚举定义为:

public enum ActionType
{
    Button,
    Link
}

如果你需要它作为字符串使用:

var myEnum = ActionType.Button;
var myEnumAsString = myEnum.ToString();

这不是最有效的方式。但这是最简单的。

否则你可以创建一个

public static class ActionType
{

    const string Button = "Button",
    const string Link = "Link"

}

但这实际上是一个枚举,但没有int基础。

答案 2 :(得分:1)

您只能为integer中的键分配enum个值,比如说

  public enum ActionType {
    Button = 1,
    Link   = 2
  }

如果您想将字符串(或 >分配给 enum 键,您可以实现扩展方法

 public static ActionTypeExtension {
   // Extension method: extends ActionType ("this" before ActionType)
   // returns string
   public static String ToReport(this ActionType value) {
     if (value == ActionType.Button)
       return "button";
     else
       return "link";
   } 
 }

....

  ActionType action = ActionType.Button;
  String result = action.ToReport(); // <- "button"

答案 3 :(得分:1)

Enum是一组命名常量,其底层类型是任何整数类型(int,byte,long等)。 String不是整数类型,因此您不能将其用作枚举值。您可以将属性类型更改为string

public class Action
{
    public string Type { get; set; }
}

并使用带有公共字符串值的类而不是枚举:

public class ActionType
{
    public static readonly string Button = "button";
    public static readonly string Link = "link";
}

但是我会使用枚举并传递整数值。如果您有一组值,则最好使用枚举,因为字符串不会限制您可以分配给操作的属性Type的内容。我可以指定“Foo”,这样就可以,因为我甚至不知道ActionType类的存在。通过枚举,您将拥有更多的安全性 - 属性具有ActionType类型,并且无法无意中分配错误的值。传递整数也会比传递枚举常量的字符串名称使用更少的流量。