2013-06-28 3 views
0

ok Я искал сеть в течение часа, пытаясь найти, есть ли даже решение для моего вопроса. Вопрос: Есть ли способ вставить строку, которая будет проанализирована в инструкции, которую вы положили в предложение if?ввод строки в качестве оператора if C#

Сценарий: Я создаю небольшое программное обеспечение, которое анализирует информацию из браузера. Каждый браузер представляет данные по-разному, и из-за этого я хочу, чтобы оператор IF задавал другой вопрос в зависимости от браузера, но я не хочу задавать все вопросы с помощью IF ..... ELSE IF ... и все это, потому что это будет неправильно.

Если пользователь пришел из FF, вопрос будет, если страница содержит определенную строку. Если пользователь приходит из IE, вопрос будет, если имеется 100 строк текста.

Вопросы разные, и я хочу знать, могу ли я отправить инструкцию из-за пределов функции, которую я кодирую, для анализа информации из всех браузеров или мне нужно задать вопрос, зависит от браузера?

+1

ОПАСНОСТЬ БУДЕТ РОБИНСОН! Будьте осторожны с любым решением, которое включает «инъекцию», будь то инъекция C# или SQL Injection. В настоящее время он является верхней частью списка уязвимостей OWASP. –

+0

Единственный способ выполнить 'if' в выражении, являющемся * строкой *, будет использовать инструмент, который анализирует его, или использовать движок, который его запускает (регулярное выражение, или, возможно, один из железных языков и т. Д.) –

+1

Я не понимаю ваш вопрос. «анализирует информацию из браузера» означает, что ваше программное обеспечение запускает браузер в качестве клиента? Или вы разбираете на стороне сервера некоторый контент, который пользователи загружали через браузер? И «вопрос», на который вы ссылаетесь ... кто спрашивает? Кому? Можете ли вы попытаться более точно описать свою проблему? И, возможно, добавить код, который вы пробовали писать, и указать, почему он не делает то, что вы ожидаете? –

ответ

4

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

Например, предположим, что этот метод выполняет что-то со строкой, если выполняется определенное условие, но вы не хотите жестко указывать, что это за условие. Вы можете написать это:

void PerhapsDoSomething(string input, Func<string, bool> predicate) 
{ 
    if (predicate(input)) 
    { 
     Console.WriteLine("I did something."); 
    } 
} 

И использовать его как это:

// Do something if input length > 2 
PerhapsDoSomething("foo", s => s.Length > 2); 

Или так:

// Do something if input ends with "bar" 
PerhapsDoSomething("foo", s => s.EndsWith("bar")); 

Предикат (это логический термин, не путайте с делегатом типа Predicate<T>, хотя, конечно, Predicate<T>is предикат) также может использовать другую информацию в области, если она определена захват переменных - считывание по anonymous methods.

Конечно, это не позволит вам избавиться от условной выбора предиката, потому что вы все еще должны сделать это где-то:

Func<string, bool> predicate; 
if (/* is Firefox */)  predicate = s => s.Length > 2; 
else if (/* is Chrome */) predicate = s => s.EndsWith("bar"); 

Однако он позволяет двигаться в условно вне вашей универсальной функции, которая не нуждается ни в чем знать о браузерах и их различиях и в более подходящем месте.

1

Вы можете использовать Func<> предикат, чтобы отправить часть кода в метод:

private void Parse(string data, Func<string, bool> question) { 
    if (question(data)) { 
    // go on 
    } 
} 

Вы можете назвать его с чем-нибудь, что это функция, которая соответствует подписи, как:

private bool CheckFx(string data) { 
    return data.IndexOf("Hello") != -1; 
} 

Parse(data, CheckFx); 

или:

Parse(data, s => s.Split(Environment.Newline).Length >= 100); 

Вы также можете сохранить предикат в переменное время выбирая, что использовать:

Func<string, bool> question; 
switch (browser) { 
    case Browser.IE: question = CheckIE; break; 
    case Browser.Fx: question = CheckFx; break; 
    default: question = CheckOther; break; 
} 
Parse(data, question);