【问题标题】:How to use a class in an static class如何在静态类中使用类
【发布时间】:2014-01-24 13:50:40
【问题描述】:

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

    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"

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

【问题讨论】:

  • Konstanten.jobStatus 是对对象的引用。该对象只是碰巧不断地为其成员返回相同的值,但这并没有使Konstanten.jobStatus.error 成为可以在 switch 语句中使用的常量值。这些必须是可以在编译时查找的真实常量。
  • 听起来你应该为我使用枚举而不是 const 字符串

标签: c# static constants


【解决方案1】:

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

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

如果你把error改成const,像这样,

public const string error = "error";

你会写的

case JobStatus.error:

并直接引用常量。但是,您的原始表达式 case Konstanten.jobStatus.error: 仍会损坏,因为 Konstanten.jobStatus 是一个对象。

【讨论】:

  • JobStatus 需要为此可访问,因此将其设为私有可能行不通。
  • @poke 是的,但由于 OP 在他的代码中没有出现“访问不一致”错误,我认为这对他来说不是问题。
【解决方案2】:

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

第一件事就是使用一个枚举,代表有限数量的状态。 对于您可能有的许多用途,这应该已经足够了。

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

确实没有必要保留常量字符串,例如“关闭”和“错误”。摆脱他们!

【讨论】:

    【解决方案3】:

    这肯定是需要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; 才能使用此属性。

    【讨论】:

      猜你喜欢
      • 2018-03-08
      • 1970-01-01
      • 2022-01-23
      • 1970-01-01
      • 1970-01-01
      • 2022-07-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-27
      相关资源
      最近更新 更多