2016-09-22 3 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 ** ed. – inspite

+0

@inspite У вас проблемы с одним из ваших собственных атрибутов, или это то, что вы не можете изменить? – dasblinkenlight

0

Это потому, что вы используете Root как статическое свойство. Item.Root означает, что вы получаете доступ к Root из класса «Item», а не объект типа экземпляра «Item».

Если вам это необходимо из самого класса, сделайте Root статическим.

Однако, если у вас есть экземпляр пункта, а также доступ к Root, а затем использовать ваш объект -

myItemObject.Root 

Также вы хотите «DoSomething()», чтобы выполнить каждый раз вы называете корень в следующем? Потому что если вы сделаете Root статичным, вы получите только первый запуск DoSomething. Статическое свойство с геттером будет необходимо, если вам нужно, чтобы он работал все время

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