重构常量字符串

时间:2016-09-22 12:09:11

标签: c# refactoring

我有一些类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

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

2 个答案:

答案 0 :(得分:4)

看起来你的代码在静态上下文中使用了这个<table id="table-projects" class="table table-hover"> <thead class="text-center"> <tr> <th width="10%"><center>Project Name</center></th> </tr> </thead> <tbody> @foreach($projects as $project) <tr> <td>{{$project->title}}</td> <tr> @endforeach </tbody> </table> ,即来自静态方法或静态属性。这意味着替换属性也必须是const

static

当然,这意味着public static string Root = DoSomething("/homepage"); 也必须是静态的。

  

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

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

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

答案 1 :(得分:0)

这是因为您使用Root作为静态属性。 Item.Root表示您正在从类&#34; Item&#34;中访问Root。而不是实例类型的对象&#34;项目&#34;。

如果你需要从类本身访问它,那么使Root成为静态的。

但是,如果您有一个Item实例并且还访问Root,那么请使用您的对象 -

myItemObject.Root

你也想要&#34; DoSomething()&#34;每次你在下面调用root时执行?因为如果你将Root设为静态,那么你只会在DoSomething第一次运行时获得。如果您需要一直运行

,则需要带有getter的静态属性
public string Root = DoSomething("/homepage");