C # перенаправление метода доступа - PullRequest
3 голосов
/ 07 сентября 2010

Ребята, мне очень стыдно просить об этом, но я застрял и не могу найти решение:

Я нашел библиотеку IniParser, которую я использую для разбора настроек из файла. Однако подход по умолчанию таков:

 FileIniDataParser parser = new FileIniDataParser();
 //Parse the ini file
 IniData parsedData = parser.LoadFile("TestIniFile.ini");
 parsetData['some']['settings'];

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

namespace my_project
{
    public class settings
    {
        public IniData ini()
        {
            string login = "Settings.ini";
            FileIniDataParser parser = new FileIniDataParser();

            // Parse the ini file with the settings
            IniData settings = parser.LoadFile(login);
            //*strptr = settings;
            return settings;
        }
    }
}

чтобы я мог получить доступ к таким настройкам:

settings.ini['some']['settings'];

Бит, я получаю ошибку:

Ошибка 329 «settings.ini ()» является 'method', но используется как 'type'

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

Ответы [ 4 ]

5 голосов
/ 07 сентября 2010

Вы определили "ini" как метод. Чтобы использовать его как есть, вам нужно набрать:

settings.ini()['some']['settings'];

Вы можете изменить это свойство , чтобы обойти эту проблему.

Однако следует помнить одну вещь: как бы вы ни писали это, каждый раз, когда вы вызываете ini(), вы создаете (и получаете доступ) новый экземпляр вашего класса IniData. Если это должен быть один общий экземпляр, вы можете использовать отложенную инициализацию со статическим свойством:

public class Settings
{
    private static IniData ini;
    public static IniData Ini
    {
        get
        {
            if (ini == null)
            {
                string login = "Settings.ini";
                FileIniDataParser parser = new FileIniDataParser();

                ini = parser.LoadFile(login);
            }
            return ini;
        }
    }
}

Таким образом, каждый вызов будет использовать один и тот же экземпляр, и он будет создавать класс IniData только один раз. Вы могли бы тогда написать:

Settings.Ini['some']['settings'];
3 голосов
/ 07 сентября 2010
var foo = Settings.Data['some']['settings'];

// ..

public static class Settings
{
    static Settings()
    {
        string login = "Settings.ini";
        FileIniDataParser parser = new FileIniDataParser();
        _data = parser.LoadFile(login);
    }

    private static readonly IniData _data;
    public static IniData Data
    {
        get { return _data; }
    }
}
2 голосов
/ 07 сентября 2010

Попробуйте сделать свой метод ini свойством :

namespace my_project
{
    public class settings
    {
        public IniData Ini
        {
            get
            {
                string login = "Settings.ini";
                FileIniDataParser parser = new FileIniDataParser();

                // Parse the ini file with the settings
                IniData settings = parser.LoadFile(login);
                //*strptr = settings;
                return settings;
            }
        }
    }
}
1 голос
/ 07 сентября 2010

Для доступа к вашему экземпляру как

settings.ini['some']['settings'];

Вам нужно сделать ini a свойство :

    public IniData ini
    {
        get
        { 
            string login = "Settings.ini";
            FileIniDataParser parser = new FileIniDataParser();

            // Parse the ini file with the settings
            IniData settings = parser.LoadFile(login);
            return settings;
        }
    }

Так, как у вас есть сейчас, вы должны получить к нему доступ:

settings.ini()['some']['settings'];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...