C# 如何在静态类中使用类

C# 如何在静态类中使用类,c#,static,constants,C#,Static,Constants,我希望我能解释我的意思 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

我希望我能解释我的意思

    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"
你能告诉我怎么解决这个问题吗

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

这是因为类
JobStatus
error
成员是一个属性,而不是编译时常量,并且
JobStatus JobStatus
是在运行时创建的对象

如果将
error
更改为
const
,如下所示

public const string error = "error";
你就可以写作了

case JobStatus.error:

并直接引用该常数。您的原始表达式
case Konstanten.jobStatus.error:
将保持中断状态,但是,因为
Konstanten.jobStatus
是一个对象。

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

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

在极端情况下,您可能需要将这些状态的解析器和呈现器转换为字符串。使用Enum.Parse()和e.ToString()方法很容易做到这一点


实际上,没有必要保持恒定的字符串,比如“closed”和“error”。摆脱他们

这绝对是需要
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
。您需要使用System.ComponentModel包含
使用此属性。

Konstanten.jobStatus
是对对象的引用。该对象只是不断地为其成员返回相同的值,但这并不使
Konstanten.jobStatus.error
成为可以在switch语句中使用的常量值。这些必须是可在编译时查找的真实常量。听起来您应该使用枚举而不是常量字符串,因为我的
JobStatus
需要对此进行访问,因此将其私有化可能不起作用。@poke是这样,但由于OP的代码中没有“不一致的访问”错误,我想这对他来说不是问题。