如何判断是否已设置枚举属性? C#

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何判断是否已设置枚举属性? C#相关的知识,希望对你有一定的参考价值。

我有一个类enum属性,如下所示:

public class Foo
{
    public Color ColorType {get;set;}
}

public enum Color
{
    Red,
    Green,
}

现在这个类可以像这样初始化:

var foo = new Foo();

没有设置ColorType属性。现在,我正在尝试创建一个方法并对是否设置枚举执行操作,例如我有一个方法

private void checkEnum(Foo foo)
{
    if(foo.ColorType !=null)
    {
        //perform these actions
    }else
    {
        //perform those actions
    }
}

然而,我得到一个警告,说值永远不会为空,经过进一步的研究,如果枚举永远不会被设置,如果默认为第一个值,在我的情况下是红色,我在考虑为我的枚举添加一个值是'未设置'并将该值设为第一个,所以如果没有设置,那么枚举将具有'未设置'的值,是否有更好的方法这样做,我提出的方法似乎可能会变得混乱

答案

您可以使用以下两种方法之一:默认枚举值或可以为空的枚举。

默认枚举值

由于枚举由整数支持,并且int默认为零,因此枚举将始终默认初始化为等于零的值。除非您明确指定枚举值,否则第一个值将始终为零,第二个值将为1,依此类推。

public enum Color
{
  Undefined,
  Red,
  Green
}

// ...

Assert.IsTrue(Color.Undefined == 0);  // success!

可空的枚举

处理未分配枚举的另一种方法是使用可空字段。

public class Foo
{
   public Color? Color { get; set; }
}

// ...

var foo = new Foo();
Assert.IsNull(foo.Color);     // success!
另一答案

您可以将其设置为底层私有字段可为空,但属性不可以。

EG

class SomeClass
{
    private Color? _color; // defaults to null

    public Color Color
    {
        get { return _color ?? Color.Black; }
        set { _color = value; }
    }

    public bool ColorChanged
    {
        get { return _color != null; }
    }
}

这样,如果color == null你知道它尚未设置,并且你也阻止用户将其设置为null(或其他答案指定的undefined)。如果colornull你100%确定用户没有设置它。

只有catch是get返回的默认值,但是如果它更适合你的程序,你总是可以抛出异常值。

您还可以更进一步,使set只在给定值不等于默认值时设置字段(取决于您的用例):

public Color Color
{
    get { return _color ?? Color.Black; }
    set
    {
        if (value != Color)
        {
            _color = value;
        }
    }
}
另一答案

你有两个真正的选择。第一种是向枚举添加未定义的值。这将是初始化属性之前的默认值。

1)

public enum Color
{
    Undefined,
    Red,
    Green,
}

您的支票如下:

private void checkEnum(Foo foo)
{
    if(foo.ColorType == Color.Undefined)
    {
        //perform these actions
    }else
    {
        //perform those actions
    }
}

2)或者你不能添加未定义的值,只需要使属性Nullable

public class Foo
{
    public Color? ColorType {get;set;}
}
public enum Color
{
    Red,
    Green,
}

并执行以下检查:

private void checkEnum(Foo foo)
{
    if(!foo.ColorType.HasValue)
    {
        //perform these actions
    }else
    {
        //perform those actions
    }
}
另一答案

枚举是Value Types,这意味着它们不是对存储在其他地方的对象的引用,因此它们不能是null。它们总是有一个默认值,就像int一样,在创建时默认为零。我建议两种方法:

  1. 添加另一个名为None的枚举条目,其值等于零。这样,您的枚举值将在创建时默认为None。然后你可以检查if(foo.ColorType != Color.None)
  2. 让你的Color财产像一个可以为空的:public Color? ColorType { get; set; }。现在它将默认为null,并可以赋值null。在这里阅读更多关于nullable类型的信息:MSDN - Nullable Types (C#)
另一答案

正如您所发现的,C#中的枚举是值类型(它们本质上是整数)而不是引用类型,因此它们不会默认为NULL,而是枚举中的最小整数值。处理枚举时不要忘记这种关系,因为它是最有用的属性之一。永远记住,无论你是否明确说明,

public enum Color
{
    Red,
    Green
}

相当于:

public enum Color
{
    Red = 0,
    Green = 1
}

虽然您当然可以为每个枚举成员提供您喜欢的任何整数值。

至于是否有更好的方法,这实际上取决于“这个”是什么,尽管你的建议只是简单地使用以下枚举设置没有错:

public enum Color
{
    None = 0,
    Red,
    Green
}

通常,当您希望能够通过名称选择一组绝对有限且离散的可能值时,您希望使用枚举。例如,假设我有一个方法,它采用4个基本方向之一(北,东,南,西)作为参数。我决定按顺时针顺序为每个方向编号,从0开始为North。

public enum Direction
{
    North = 0,
    East,
    South,
    West
}

现在,我没有让我的函数接受一个整数参数,并相信我会记住每个数字引用的内容,我现在可以让函数将枚举成员作为参数,并立即知道我正在处理的方向。例如:

getNeighbor(1);

阅读更容易:

getNeighbor(Direction.East);
另一答案

enum是一个值类型,因此它不能为null,并且存储通常是一个整数。如果你想为你的类型定义一个未定义的值,你可能会有

public enum Color
{
    Undefined,
    Red,
    Green,
}

以上是关于如何判断是否已设置枚举属性? C#的主要内容,如果未能解决你的问题,请参考以下文章

java 如何实现判断一个对象所有的属性是不是为空

Object的几个方法(defineProperty,hasOwnProperty...)

如何在C ++中将枚举导入不同的命名空间?

Python代码阅读(第38篇):根据谓词函数和属性字符串构造判断函数

如何通过 MVC Razor 代码获取枚举成员的显示名称属性?

深入理解枚举属性与for-in和for-of