Алгоритм флага динамического связывания, который использует RegExp - PullRequest
0 голосов
/ 03 июня 2011

Я занимался этим по крайней мере 3 часа - 1,5-2 из которых были потрачены на изучение регулярных выражений, чтобы сделать это. Я до сих пор близко не понимаю его, но это не совсем приоритет: я бы предпочел сначала очистить этот алгоритм.

SO ..

Здесь у меня есть приятный маленький метод, который принимает строку, которая, как правило, должна содержать фразу, определяющую, какой тип флага привязки нужно вернуть. Строка оценивается регулярным выражением. Если это выражение принимает значение true, оно продолжает перемещаться по массиву, в котором перечислены правильные настройки BindingFlags, которые нужно установить. Я понял большую часть этого - основная проблема - это A) простота и B) последние два бита: обеспечение возврата BindingFlag (что, я полагаю, я сделал, но я все еще получаю логическую ошибку от этого очевидно, что я не имел), и сравнивая строку с фактическим массивом BindingFlag, чтобы определить, какой флаг выбрать и вернуть.

Вид сложного для моего уровня. Вот код:

private static BindingFlags CheckPropBinding(string bindFlagSpec) 
        {
            BindingFlags binderFlag; //--will be returned.

            string bindLower = bindFlagSpec.ToLower(); //--lowers string parameter.

            Match matchBinder; //--our matcher :).

            string regex = "regex dummy"; /*--this is a dummy which will be replaced when I've found the appropriate regex to use. */

            matchBinder = Regex.Match(bindLower, regex); 

            if (matchBinder.Success) //--if success, will go on...
            {
                for(int bindIndex = 0; bindIndex < bindings.Length; bindIndex++) /*--compares string with bindingFlag array */
                {
                    if (bindLower.Contains(bindings[bindIndex].ToString()))
                    {
                        binderFlag = bindings[bindIndex];

                        break;
                    }
                    else 
                    {
                        if (bindIndex == bindings.Length && !bindLower.Contains(bindings[bindings.Length].ToString())) 
                        {
                             binderFlag = BindingFlags.NonPublic; /*--this is just a

проверка в крайнем случае, присвоение флага по умолчанию, если по какой-либо причине его нельзя выбрать. * / перерыв; } * +1010 *

                        continue;
                    }

                 }
            }


            return binderFlag; //--returned :).
       }

Возможно, мне следует также упомянуть поле массива привязки флагов: `

public class PropertyManagener
    {
        private static BindingFlags[] bindings = {BindingFlags.NonPublic, BindingFlags.Public, 
                                                     BindingFlags.Static, BindingFlags.Instance};

1 Ответ

1 голос
/ 03 июня 2011

Ошибка в том, что вы не гарантируете инициализацию binderFlag перед его возвратом.Почему бы не сделать что-то подобное вместо этого?Это устанавливает binderFlag на ваше возвращаемое значение по умолчанию, поэтому, если ваш алгоритм не может определить, что использовать, он возвращает NonPublic.

Это по крайней мере разрешит ошибку компилятора!К сожалению, я не могу судить о действительной правильности алгоритма, который вы реализовали.

    private static BindingFlags CheckPropBinding(string bindFlagSpec)         
    {
        BindingFlags binderFlag = BindingFlags.NonPublic;
        string bindLower = bindFlagSpec.ToLower(); //--lowers string parameter.            
        Match matchBinder; //--our matcher :).            
        string regex = "regex dummy"; /*--this is a dummy which will be replaced when I've found the appropriate regex to use. */            
        matchBinder = Regex.Match(bindLower, regex);
        if (matchBinder.Success) //--if success, will go on...            
        {
            foreach (BindingFlags t in bindings)
            {
                if (bindLower.Contains(t.ToString()))
                {
                    binderFlag = t;
                    break;
                }
            }
        }
        return binderFlag; //--returned :).       
    }
...