C# 重构常量字符串

C# 重构常量字符串,c#,refactoring,C#,Refactoring,我有一些类项,其中包含一个字段 public const string Root = "/homepage"; 不幸的是,这个字符串不是常量 当我试着像你说的那样重新定义 public string Root = DoSomething("/homepage"); 或财产 public string Root { get { return DoSomething("/homepage"); } } 我被两种不同类型的错误搞砸了 A field initialize

我有一些类项,其中包含一个字段

public const string Root = "/homepage";
不幸的是,这个字符串不是常量

当我试着像你说的那样重新定义

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

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

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

当然,这意味着DoSomethingstring也必须是静态的

属性参数必须是常量表达式、typeof表达式或属性参数类型的数组创建表达式


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

看起来您的代码一直在静态上下文中使用此常量,即,来自静态方法或静态属性。这意味着替换属性也必须是静态的:

当然,这意味着DoSomethingstring也必须是静态的

属性参数必须是常量表达式、typeof表达式或属性参数类型的数组创建表达式


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

这是因为您将Root用作静态属性。Root表示您是从类项而不是实例类型项的对象访问Root

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

但是,如果您有一个Item实例,并且也在访问Root,则使用您的对象-

myItemObject.Root
另外,是否希望每次在下面的代码中调用root时都执行DoSomething?因为如果将Root设置为静态,那么只能在第一次运行DoSomething。如果需要始终运行静态属性,则需要使用getter

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

这是因为您将Root用作静态属性。Root表示您是从类项而不是实例类型项的对象访问Root

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

但是,如果您有一个Item实例,并且也在访问Root,则使用您的对象-

myItemObject.Root
另外,是否希望每次在下面的代码中调用root时都执行DoSomething?因为如果将Root设置为静态,那么只能在第一次运行DoSomething。如果需要始终运行静态属性,则需要使用getter

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

@伊凡斯托夫:你是对的,我错过了第二个错误。谢谢谢谢,至少现在我知道我有麻烦了。@inspite你自己的属性有问题吗,还是你不能更改?@@dasblinkenlight我想这是我不能更改的。@IvanStoev你是对的,我错过了第二个错误。谢谢谢谢,至少现在我知道我有麻烦了。@inspite你自己的属性有问题吗,还是你不能更改?@@dasblinkenlight我想这是我不能更改的属性。