2016-09-22 52 views
1

我有一些类Item其中包含一个字段重构常量字符串

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 

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

回答

4

看起来您的代码在静态上下文中使用此const,即来自静态方法或静态属性。这意味着,产权置换必须static还有:

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

当然,这意味着DoSomething(string)必须进行静态的为好。

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

不幸的是,你被困在这儿了:这个错误不能被固定,因为属性参数必须是常量。您需要引用特定属性的文档以查看是否有添加“间接级别”的方法,并使属性的用户在运行时执行额外的请求以提供计算值。

+0

@IvanStoev你是对的,我错过了第二个错误。谢谢! – dasblinkenlight

+0

谢谢,至少现在我*知道*我是scr **编辑。 – inspite

+0

@inspite您是否遇到了您自己的某个属性问题,或者是您无法更改的问题? – dasblinkenlight

0

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

如果你需要它可以从类本身访问,然后让根为静态。

然而,如果你有项目的一个实例,也访问根目录,然后用你的对象 -

myItemObject.Root 

而且你想“DoSomething的()”,执行每次你打电话根在下面?因为如果您将Root设为静态,那么您只会在DoSomething第一次运行时获得。如果你需要它一直运行的话,需要使用吸气剂的静态属性

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