2015-05-04 2 views
-2

Я нашел аналогичный вопрос, но он был закрыт и не ответил на это для меня.Можно ли проверить наличие переменной в C#?

У меня есть статический класс Globals, который содержит некоторые переменные и другой класс, который делает вещи. Я хочу, чтобы Stuff обнаружил, существуют ли Globals, а затем измените некоторые из его переменных на значения, хранящиеся в Globals. Я попробовал

try{ 
    for (int i = 0; i < Globals.StuffArray.Length; i++) 
     StuffArray[i] = Globals.StuffArray[i]; 
} 
catch 
{ 
} 

в конструкторе для предметов.

Это, очевидно, не работает, но идея состояла в том, чтобы попытаться изменить переменные и выбросить ошибку, чтобы get игнорировался, если Globals.StuffArray не существует.

Я все еще хотел бы знать, возможно ли это сделать, но я не решаю эту проблему таким образом, я добавил установщик, чтобы изменить настройки по умолчанию из Globals, и это работает нормально.

обновление для ясности:

Я хотел сделать так, чтобы я мог уйти из Globals и до сих пор есть материал компиляции.

Update:

В jvascript вы можете иметь что-то вроде

if (condition1) var x = 0; 
if (x) doStuffTo(x); 

JavaScript делает вещи в фоновом режиме, чтобы сделать это логично. Я хотел знать, может ли C# сделать что-то подобное.

Повторить: я спросил, потому что мне интересно, если это возможно. Некоторые из ответов, похоже, пропустили ту часть, где я сказал, что я не собираюсь решать эту проблему таким образом, проблема была легко решена путем изменения свойства Globals.

+7

Во время компиляции вы всегда должны знать, существует ли класс или член. Какую проблему ты пытаешься решить? – SLaks

+2

Вы имеете в виду «проверить его на null», а не «проверить, существует ли он»? Ваше приложение не будет компилироваться, если переменная не существует. – mason

+0

Вы добавляете эти новые переменные динамически? Я бы использовал словарь, тогда вы можете проверить, есть ли имя переменной в словаре вместо массива. – Marko

ответ

1

Использование отражения.

С отражением вы можете:

  • Загрузка сборок
  • увидеть, какие типы находятся внутри сборки.
  • Посмотрите, какие поля и свойства находятся внутри типа.
  • Прочитайте и напишите их значения.
  • И многое другое ...

Во время выполнения полей и типов не может изменить в сборке, так что я предполагаю, что вы имеете в виду сборки, которые вы не знаете, во время компиляции. Сборка, которую вы загрузите во время выполнения.

Поскольку я не знаю точно, что вам нужно, и что у вас есть, мой пример является приближенным:

var asm = Assembly.LoadFile(@"C:\MyDynamicDll.dll"); 
var type = asm.GetType("Global"); 
if (type == null) 
    // Do something if Global does not exists. 
var fieldInfos = type.GetFields(BindingFlags.Static | BindingFlags.Public); 
foreach(var fieldInfo in fieldInfos) 
{ 
    var value = fieldInfo.GetValue(null); 
    // Do something with the value. 
} 

Будьте осторожны: Отражение довольно медленно.

* EDIT *

В обновленной вопрос вы ссылаетесь на JavaScript. Javascript интерпретируется во время выполнения. Все типы и значения оцениваются снова и снова, что делает язык немного медленнее, но более гибким. C# интерпретируется во время компиляции, которая делает некоторые вещи, такие как типы, static, что делает все это немного быстрее. Это единственная причина, по которой скриптовые языки могут изменять свои типы во время выполнения. (Конечно, есть исключения.)

+0

Спасибо, это именно то, что я хотел знать. Я использую отражение для проверки свойств дочернего класса из Stuff, так что мне не нужно было писать 10 нечетных, очень похожих и длинных функций. Вы упомянули, что Reflection медленный, для меня ли это неэффективно? Должен ли я просто написать 10 отдельных функций. – Damien

+0

Всё зависит от меня. Предположим, что регулярный вызов (чтение и запись свойства) принимает 1us, а отражение 1ms ... и вы используете его только 10 раз, тогда задержка не будет заметна. Если вы назовете это миллион раз, тогда это будет примечательно. –

0

Нет, вы не можете этого сделать. Вы всегда будете получать ошибку времени компиляции, если Globals не существует.

Кроме того, ваша попытка/улов не была бы лучшей практикой. Вы бы ловили и игнорировали больше ошибок, чем тот, который вы хотели проверить. Постарайтесь, чтобы такие блоки были как можно более узкими.

Смежные вопросы