重构常量字符串

本文关键字:字符串 常量 重构 | 更新日期: 2023-09-27 18:08:13

我有一个类Item,它包含一个字段

public const string Root = "/homepage";

不幸的是,这个字符串不是const!

当我尝试重新定义

public string Root = DoSomething("/homepage");

或属性

public string Root
{
   get {
      return DoSomething("/homepage");
    }
}

我被两种不同类型的错误所困扰

A field initializer cannot reference the non-static field, method, or property 'Item.Root'

和这个,我认为这可能是一个更大的问题

An attribute argument must be a constant expression, typeof expression or array creation expression of an attribute parameter type

如果没有认真的重构练习,我真的不知道如何解决这个问题。任何建议吗?

重构常量字符串

看起来你的代码一直在静态上下文中使用这个const,即从静态方法或静态属性。这意味着替换属性也必须是static:

public static string Root = DoSomething("/homepage");

当然,这意味着DoSomething(string)也必须是静态的。

属性参数必须是属性参数类型

的常量表达式、typeof表达式或数组创建表达式。

不幸的是,你被困在这里:这个错误无法修复,因为属性参数必须是常量。您需要参考特定属性的文档,以查看是否有方法添加"间接级别",并使该属性的用户在运行时执行额外的请求,以允许您提供计算值。

这是因为您正在使用Root作为静态属性。项。Root意味着你从类"Item"访问Root,而不是实例类型"Item"的对象。

如果你需要从类本身访问它,那么把Root设置为静态。

然而,如果你有一个Item的实例并且也访问Root,那么使用你的对象-

myItemObject.Root

你还想要"DoSomething()"执行每次你调用根在以下?因为如果你把Root设置为静态那么你只会得到DoSomething第一次运行时的情况。如果你想让静态属性一直运行,就需要带getter的静态属性

public string Root = DoSomething("/homepage");