2016-09-22 83 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");