C# 通过属性c解析字符串值#

C# 通过属性c解析字符串值#,c#,asp.net-mvc,custom-attributes,C#,Asp.net Mvc,Custom Attributes,我使用的是ASP.NET MVC,我有以下模型类: public enum ListType { black, white } public class ListAddSiteModel : ApiModel { [RequestParameter] public ListType list { get; set; } } 但这不是我想要的方式。当我没有在请求的URL中传递list参数时,我得到的列表是黑色的。但是我想知道,如果list参数不是black或whi

我使用的是
ASP.NET MVC
,我有以下模型类:

public enum ListType
{
    black,
    white
}
public class ListAddSiteModel : ApiModel
{
    [RequestParameter]
    public ListType list { get; set; }
}
但这不是我想要的方式。当我没有在请求的
URL
中传递list参数时,我得到的列表是
黑色的。但是我想知道,如果list参数不是
black
white
字符串,那么
list
必须为null。可以编写自定义属性
[IsParsable]
并将其添加到列表属性中吗

public class ListAddSiteModel : ApiModel
{
    [RequestParameter]
    [IsParsable]
    public ListType list { get; set; }
}
简单的出路:

public enum ListType
{
    novalue = 0, 
    black,
    white
}
虚拟对象必须是第一个(映射到
0==default(Enum)

简单方法:

public enum ListType
{
    novalue = 0, 
    black,
    white
}

虚拟对象必须是第一个(映射到
0==default(Enum)

传递非黑白值的唯一方法是传递
int
。您可以通过在setter中添加一个调用的检查来防止这种情况,例如:

您还可以将其与Henk Holterman的答案结合起来,在枚举中添加一个等于0的
NA
成员。这可能会使您的代码更易于阅读


在这两种情况下,您的代码都必须考虑特殊值(
NA
null
)。使用可为空的类型会使您更难忘记这一点,但会使代码变得杂乱无章。

传递非黑白值的唯一方法是传递
int
。您可以通过在setter中添加一个调用的检查来防止这种情况,例如:

您还可以将其与Henk Holterman的答案结合起来,在枚举中添加一个等于0的
NA
成员。这可能会使您的代码更易于阅读


在这两种情况下,您的代码都必须考虑特殊值(
NA
null
)。使用可为null的类型会使您更难忘记这一点,但会使您的代码有点乱。

列表
不能为null,因为
枚举
不是可为null的类型。您应该将其定义为
publicListType?list
或为ListType指定默认值(
ListType.none
)-还应将这些枚举和属性大写names@RGraham问号是什么意思?
list
不能为null,因为
enum
不是可为null的类型。您应该将其定义为
publicListType?list
或为ListType指定默认值(
ListType.none
)-还应将这些枚举和属性大写names@RGraham问号是什么意思?仍然不会阻止某人传递无效值,如果这是实际问题,仍然不会阻止某人传递无效值,如果这是实际问题,
列表类型中的问号是什么_列表类型平均值。这个构造是不可隐藏的。这是a的C#语法。它用于允许为不允许空值的值类型处理空值。从.NET2.0开始,它就在C#中,所以它几乎无处不在。这里需要显式的属性声明吗?如果在类型中找不到提供的值,MVC不会自动将可空枚举绑定到
null
。@RGraham这不会阻止用户代码传递错误的值。如果这不是问题,您可以保留可为空的声明。
列表类型中的问号是什么_列表类型平均值。这个构造是不可隐藏的。这是a的C#语法。它用于允许为不允许空值的值类型处理空值。从.NET2.0开始,它就在C#中,所以它几乎无处不在。这里需要显式的属性声明吗?如果在类型中找不到提供的值,MVC不会自动将可空枚举绑定到
null
。@RGraham这不会阻止用户代码传递错误的值。如果这不是问题,您可以保留可为null的声明。