使用函数设置静态变量的值

时间:2018-03-22 09:05:28

标签: c# asp.net declaration static-variables

我在我的解决方案中声明了一些静态变量,如下所示,

using System;
using System.Collections.Generic;
using System.Configuration;

namespace SSPWAS.Utilities
{
    public class Constants
    {
        public static string ApproverlevelL1 = "M23";
        public static string ApproverlevelL2 = "Cre";
        public static string ApproverlevelL3 = "Free34";
        public static string ApproverlevelL4 = "CDF";
        public static string ApproverlevelL5 = "FM";
    }
}

我的问题是,如果我尝试将其设置如下,那么我得到错误:

  

非静态字段,方法或者需要对象引用   属性

using System;
using System.Collections.Generic;
using System.Configuration;

namespace SSPWAS.Utilities
{
    public class Constants
    {
        public static string ApproverlevelL1 = getLevel("1");
        public static string ApproverlevelL2 = getLevel("2");
        public static string ApproverlevelL3 = getLevel("3");
        public static string ApproverlevelL4 = getLevel("4");
        public static string ApproverlevelL5 = getLevel("5");
    }
}

public string getLevel(string levelID)
{
  string levelName;
  //logic here
  return levelName; 
}

那我怎么能实现这个目标呢?

4 个答案:

答案 0 :(得分:1)

看起来你正在尝试从静态属性调用实例方法(非静态)。

尝试将您的方法设为静态:

public string getLevel(string levelID)
{
  string levelName;

  //logic here
  return levelName; 
}

答案 1 :(得分:0)

你的意思是:

using System;
using System.Collections.Generic;
using System.Configuration;

namespace SSPWAS.Utilities
{
    public static class Constants
    {
        public static string ApproverlevelL1 = getLevel("1");
        public static string ApproverlevelL2 = getLevel("2");
        public static string ApproverlevelL3 = getLevel("3");
        public static string ApproverlevelL4 = getLevel("4");
        public static string ApproverlevelL5 = getLevel("5");
        private static string getLevel(string levelID)
        {
            string levelName;
            logic here
            return levelName; 
        }
    }
}

答案 2 :(得分:0)

你的"常数"不是一成不变的。如果希望它们像常量一样使用它们readonly,同时使用值初始化静态成员。您也可以将它们设为属性,并仅使用get访问器来调用getLevel方法。

正如其他人所指出的,你不能在静态成员中调用非静态成员,而不实例化非静态类的实例。

您的getLevel方法也需要在自己的类中。目前它并不属于类或命名空间。如果你想要它在自己独立的类中,那么只需将方法设置为静态。

.NET命名约定建议您使用Pascal Casing方法。因此,请重命名getLevel方法。

using System;
using System.Collections.Generic;
using System.Configuration;

namespace SSPWAS.Utilities
{
    public static class Constants
    {
        // Use readonly static members
        public static readonly string
            ApproverlevelL1 = GetLevel("1"),
            ApproverlevelL2 = GetLevel("2"),
            ApproverlevelL3 = GetLevel("3"),
            ApproverlevelL4 = GetLevel("4"),
            ApproverlevelL5 = GetLevel("5");

        // Or you could use the latest convenient syntax
        public static string ApproverLevelL6 => GetLevel("6");

        // Or you could use readonly properties
        public static string ApproverLevelL7 { get { return GetLevel("7"); } }

        private static string GetLevel(string levelId)
        {
            //... do logic
            return "";
        }
    }
}

或者如果你想在自己的类中使用该方法:

public static class Constants
{
    // Use readonly static members
    public static readonly string
        ApproverlevelL1 = Level.Get("1"),
        ApproverlevelL2 = Level.Get("2"),
        ApproverlevelL3 = Level.Get("3"),
        ApproverlevelL4 = Level.Get("4"),
        ApproverlevelL5 = Level.Get("5");

    // Or you could use the latest convenient syntax
    public static string ApproverLevelL6 => Level.Get("6");

    // Or you could use readonly properties
    public static string ApproverLevelL7 { get { return Level.Get("7"); } }
}

public class Level
{
    public static string Get(string levelId)
    {
        //... do logic
        return "";
    }
}

答案 3 :(得分:0)

如果您的问题是您希望getLevel方法位于不同的类中,您可以将一个Function添加到静态类中并使用该方法覆盖它。

using System;
using System.Collections.Generic;
using System.Configuration;

namespace SSPWAS.Utilities
{
    public class Constants
    {
        public static Func<string, string> getLevel = x => string.Empty;
        // added get accessor to make these read only
        public static string ApproverlevelL1 { get; } = getLevel("1");
        public static string ApproverlevelL2 { get; } = getLevel("2");
        public static string ApproverlevelL3 { get; } = getLevel("3");
        public static string ApproverlevelL4 { get; } = getLevel("4");
        public static string ApproverlevelL5 { get; } = getLevel("5");
    }

    public class WhateverClass
    {
        public string getLevel(string levelID)
        {
            string levelName;
            //logic here
            return levelName; 
        }

        // call this before accessing the fields in your Constants class
        public void Init()
        {
            Constants.getLevel = x => getLevel(x);
        }
    }
}

我能想到这样做的唯一原因可能是你有两个应用程序使用这个静态类,他们需要以不同的方式获得级别。也许一个使用实际的常量值,另一个读取数据库等。

如果你不需要这个,那么最简单的答案是将方法实际作为静态方法放入类中:

namespace SSPWAS.Utilities
{
    public class Constants
    {
        public static string getLevel(string levelID)
        {
            string levelName;
            //logic here
            return levelName; 
        }
        // added get accessor to make these read only
        public static string ApproverlevelL1 { get; } = getLevel("1");
        public static string ApproverlevelL2 { get; } = getLevel("2");
        public static string ApproverlevelL3 { get; } = getLevel("3");
        public static string ApproverlevelL4 { get; } = getLevel("4");
        public static string ApproverlevelL5 { get; } = getLevel("5");
    }
}