我希望我能解释一下我的意思。
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"
你能告诉我如何解决这个问题吗?
答案 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;
才能使用此属性。