2010-09-07 7 views
3

Guys Je suis vraiment embaraced de demander cela, mais je me suis coincé et je ne peux pas penser à une solution:C# redirection méthode accès

Je trouve une bibliothèque iniparser que j'utilise pour les paramètres de l'analyse de fichiers. Cependant, l'approche par défaut est la suivante:

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

Dans mon projet, cependant, je ne veux pas appeler partout l'analyseur, donc je l'ai fait une classe qui charge le fichier au démarrage et tout ce que je dois faire est juste d'accéder à l'instance. Voici ce que je veux:

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; 
     } 
    } 
} 

pour que je puisse accéder aux paramètres comme ceci:

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

Bit i obtenir une erreur:

Error 329 'settings.ini()' is a 'method' but is used like a 'type'

Je sais qu'il ya probablement trop noobish, mais J'essaie actuellement d'apprendre C# et des expériences comme celle-ci enseignent plus que la lecture d'un livre de 500 pages.

Répondre

5

Vous avez défini "ini". Pour l'utiliser, tel quel, vous devez taper:

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

Vous pouvez change this to a property de contourner ce problème.

Cependant, une chose à prendre en compte - la façon dont vous avez écrit ce, chaque fois que vous appelez ini(), vous créez (et l'accès) une nouvelle instance de votre classe IniData. Si cela est censé être une seule instance partagée, vous pouvez utiliser l'initialisation paresseuse avec une propriété statique:

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; 
     } 
    } 
} 

De cette façon, chaque appel utilisera la même instance, et il ne créer la classe IniData une fois. Vous pouvez alors écrire:

Settings.Ini['some']['settings']; 
+0

Merci vraiment bien travailler et en plus de sa seule instance.Merci encore une fois. – Anonymous

2

Essayez de faire votre méthode ini une propriété:

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

... sauf l'analyse du fichier à chaque fois est probablement pas un bon plan :) – jvenema

+0

@jvenema: C'était mon idée ... et pourquoi je l'avais recommandé un appui vertical statique. –

+0

Merci pour cela, j'apprécie. – Anonymous

1

Pour accéder à votre instance comme

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

Vous devez faire ini un property:

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; 
     } 
    } 

La manière tu as e maintenant, vous devez accéder comme: comme méthode

settings.ini()['some']['settings']; 
3
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; } 
    } 
} 
+0

Ceci est correct - bien que je signale que rendre statique "Settings" n'est pas nécessaire. (Il peut être très correct de le faire, mais il peut ne pas, si plusieurs "paramètres" sont possibles ...) –

+0

Merci pour cela aussi une belle solution propre – Anonymous