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的代码中没有“不一致的访问”错误,我想这对他来说不是问题。