【问题标题】:How to override defined values in C#?如何覆盖 C# 中定义的值?
【发布时间】:2014-02-15 11:56:00
【问题描述】:

我从事过 iOS 项目,现在开始使用 Windows Phone,

在 iOS 中,我已将所有常见类复制到一个文件夹中(比如说父级),并将该文件夹链接到不同的项目中,比如说子项目。

在公共类中,我有一个名为 Constants.m 的类,因为我已经使用大约 98 个语句的某些值来挑战所有 #define 语句,我在所有类中都使用它。

在子项目中,我使用的是 .pch 文件,因为我只定义了项目特定的值 #define 语句,比如说 10 个值。

现在,当我运行子项目时,我在 .pch 文件中定义的任何值都将使用 Constants.m 中的默认值覆盖该值,因此我将获得子项目的特定值以及我未定义的任何值在子项目中,代码将从 Constants.h 中选择默认值。

我正在尝试在 Windows 手机应用程序开发中使用类似的东西,我可以链接这些类,但我无法从其他文件中获取 #define

How to use #define from another file?

有什么方法可以覆盖定义的值吗?就像iOS一样。

【问题讨论】:

  • C# 在你使用它的方式上根本不支持#define。
  • 您可以使用静态常量来定义所述值,但是,#define 在 c# 中的工作方式与在 c/c++ 中的工作方式不同 (reference)
  • @GMasucci 静态常量 can't be overridden - 虚拟属性似乎最适合这里。
  • 可能是带有属性的静态类?
  • 你有几个选项,静态属性和重写的单例都可以工作。

标签: c# visual-studio windows-phone-8 windows-8 c-preprocessor


【解决方案1】:

在 C# 中,您不能使用 #define 来设置全局常量的值。

在我的脑海中,有两种方法可以在父项目中拥有全局常量并在子项目中覆盖它们:

1) 使用配置(我的个人喜好)

2) 使用虚拟属性(如 cmets 中所述)

Config 最简单的形式如下所示

<configuration>
 <appSettings>
  <add key="Setting1" value="Value1" />
  <add key="Setting2" value="Value2" />
 </appSettings>
</configuration>

这样使用

string setting1 = ConfigurationSettings.AppSettings["Setting1"];

虽然我强烈建议使用custom configuration sections

虚拟属性最简单的是

// in parent project
class ParentValues
{
    public virtual int Key1
    {
        get { return 5; }
    }

    public virtual int Key2
    {
        get { return 10; }
    }
}

// in child project
class ChildValues : ParentValues
{
    public override int Key2
    {
        get
        {
            return 12;
        }
    }
}

和使用一样

// in child project
class ValueUser
{
    public int GetValue()
    {
        ChildValues cv = new ChildValues();
        return cv.Key2;
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-04-07
    • 1970-01-01
    • 2017-06-05
    • 1970-01-01
    • 2014-12-31
    • 1970-01-01
    • 1970-01-01
    • 2012-02-20
    相关资源
    最近更新 更多