2014-01-24 116 views
1

我希望我能解釋我的意思。如何在靜態類中使用類

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

'Konstanten.jobStatus'是對象的引用。該對象恰好不斷地爲其成員返回相同的值,但這不會使'Konstanten.jobStatus.error'成爲可用於switch語句的常量值。那些必須是* real *常量,可以在編譯時查找。 – poke

+6

聽起來你應該使用枚舉而不是const字符串 –

回答

2

but this causes an error: case Konstanten.jobStatus.error:

這是因爲類JobStatuserror構件是一個屬性,不是編譯時間常數,因爲JobStatus jobStatus是在運行時創建的對象。

如果更改errorconst,這樣,

public const string error = "error"; 

你就可以寫

case JobStatus.error: 

,並直接引用不變。但是,原始表達式case Konstanten.jobStatus.error:仍然會被破壞,因爲Konstanten.jobStatus是一個對象。

+1

'JobStatus'需要爲此可訪問,所以私人可能無法正常工作。 – poke

+0

@poke這是真的,但由於OP沒有在他的代碼中得到「不一致的訪問」錯誤,我認爲這對他來說不是問題。 – dasblinkenlight

+0

哦,對,沒錯。 – poke

1

你應該試着從心理上分離程序的狀態和你正在使用的實際值。

第一件事就是使用枚舉,表示有限的狀態數。 這應該已經足夠用於許多許多用途。

在極端情況下,您可能需要解析器和這些狀態的呈現器來處理字符串。這很容易用Enum.Parse()和e.ToString()方法完成。

真的不需要保持常量字符串,比如「closed」和「error」。擺脫他們!

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;才能使用此屬性。