如何在静态类中使用类

时间:2014-01-24 13:50:41

标签: c# static const

我希望我能解释一下我的意思。

    namespace BackgroundJob
{
public static class Konstanten
{
    public const string closed = "closed";
    public const string error = "error";
    public static readonly JobStatus jobStatus = new JobStatus();
}
private class JobStatus
{
    public string closed { get { return "closed"; } }
    public string error { get { return "error"; } }
}
}

我认为如果使用它们会更好地对常量进行分组。 这就是我创建“JobStatus”类的原因。我在switch case语句中使用常量。这很好用:

 case Konstanten.error:

但这会导致错误:

case Konstanten.jobStatus.error:
ErrorMessage: "A constant value is expected"

你能告诉我如何解决这个问题吗?

3 个答案:

答案 0 :(得分:2)

  

但这会导致错误:case Konstanten.jobStatus.error:

这是因为类error的{​​{1}}成员是属性,而不是编译时常量,因为JobStatus是在运行时创建的对象。

如果您将JobStatus jobStatus更改为error,就像这样,

const

你可以写

public const string error = "error";

直接引用常量。但是,原始表达式case JobStatus.error: 仍然会被破坏,因为case Konstanten.jobStatus.error:是一个对象。

答案 1 :(得分:1)

您应该尝试在心理上将程序的状态与您尝试使用的实际值分开。

第一件事就是使用枚举,代表有限数量的状态。 这应该足以满足您的许多用途。

在极端情况下,您可能需要将这些状态的解析器和渲染器转换为字符串。这可以通过Enum.Parse()和e.ToString()方法轻松完成。

实际上没有必要保持常量字符串,例如“关闭”和“错误”。摆脱它们!

答案 2 :(得分:0)

这肯定是需要enum常量的情况。以下是如何使用它们:

public enum JobStatus
{
    [Description("Job is Closed")]
    Closed,
    [Description("Job Had Error")]
    Error
}

public class Job
{
    public JobStatus Status { get; set; }

    public void Report()
    {
        switch(Status)
        {
            case JobStatus.Closed:
                // handle closed
                break;
            case JobStatus.Error:
                // handle error
                break;
        }

        Console.WriteLine( Status.GetDescription() );
        // Prints "Job Had Error"
    }
}

class Program
{
    static void Main(string[] args)
    {
        var job=new Job();
        job.Status=JobStatus.Error;
        job.Report();
    }
}

public static class Extensions
{
    public static string GetDescription(this Enum value)
    {
        Type type=value.GetType();
        var field=type.GetField(value.ToString());
        if(field!=null)
        {
            var attr=field.GetCustomAttributes(typeof(DescriptionAttribute), false) as DescriptionAttribute[];
            if(attr.Length>0)
            {
                return attr[0].Description;
            }
        }
        return string.Empty;
    }
}

我添加了一个扩展方法来提取为每个作业状态值定义的DescriptionAttribute。您需要包含using System.ComponentModel;才能使用此属性。