2010-08-07 3 views
1

J'ai le code suivant:Comment implémenter un dictionnaire statique <T> avec des paramètres à Runtime en C#?

public static class ScraperMasterUriDetails 
    { 
     public static Dictionary<Guid, string> MasterUriDetails; 

    } 

Cependant, j'ai décidé que je dois ajouter un entier au dictionnaire Dictionary<ScraperMasterUriDetails>, donc je pensais que j'ajouter des propriétés et quelques paramètres au constructeur.

Mais, vous ne pouvez pas faire cela en C#. Comment puis-je implémenter ce que j'essaie de mettre en œuvre?

EDIT:

Un membre plus expérimenté édité mon post, donc je vais le laisser comme ça. Je ne me soucie pas de l'utilisation d'un dictionnaire (était juste la bonne chose à utiliser à la fois)

Essentiellement, je veux juste une liste de trois types de données d'une manière structurée, sauf que je veux toujours faire référence à une instance de la classe qui stocke les valeurs, donc statique. Maintenant, je l'ai toujours fait la liste des (T) comme:

public class WebsiteTitles 
{ 
    public string WebsiteId { get; set; } 
    public string Keywords { get; set; } 

    public WebsiteTitles(string websiteguid, string keywords) 
    { 
     WebsiteId = websiteguid; 
     Keywords = keywords; 
    } 

    public WebsiteTitles() 
    { 
    } 
} 

Et puis fait ce qui suit

  List<WebsiteTitles> _siteTitles = new List<WebsiteTitles>(); 
      _siteTitles.Add(new WebsiteTitles("blah", "keyword")); 

Cependant, dans ce scénario, je veux comme quelque chose de similaire à ce qui précède, mais statique (Je ne veux pas créer d'instances etc. J'apprécie vraiment toutes les suggestions, d'où la raison pour laquelle j'ai édité mon post pour fournir plus d'informations

En note, je vais probablement vouloir utiliser LINQ pour extraire des enregistrements, par exemple obtenir enregistrer où guid == guid e C'est à peu près tout ce que je vais utiliser pour ça.

+1

Soyez ** très attentif aux problèmes de threads ici. –

Répondre

2
+0

@Steven Sudit, Ash: Ne le fais pas! http://www.oreillynet.com/cs/user/view/cs_msg/23417. En outre: http://sites.google.com/site/steveyegge2/singleton-considered-stupid. –

+0

@Merl: Je ne suis pas un grand fan du design-pattern-for-every-occasion, mais cela semble être un cas assez évident. Pourquoi ce ne serait pas une bonne idée ici? –

+0

+1, @Merlyn: singleton est une bonne solution pour les besoins du PO. – Markos

1

Pourquoi ne pas simplement utiliser la syntaxe collection de initialiseur? http://msdn.microsoft.com/en-us/library/bb384062.aspx

public static class ScraperMasterUriDetails 
{ 
    public static List<WebsiteTitles> MasterUriDetails = new List<WebsiteTitles>() 
    { 
     new WebsiteTitles() 
     { 
      WebsiteId = Guid.NewGuid().ToString(), 
      Keywords = "programming, fish, popsicles, nihilism", 
     }, 
    }; 
} 

Si vous devez consulter un site Web par ID, puis par tous les moyens utilisent un dictionnaire:

public static class ScraperMasterUriDetails 
{ 
    public static Dictionary<Guid, string> MasterUriDetails = new Dictionary<Guid, string>() 
    { 
     { Guid.NewGuid(), "programming, fish, popsicles, nihilism" }, 
     { new Guid("abcdef" /* etc */), "ankles, sprocket, glucose, the moon" }, 
    }; 
} 

Avant Edit:

S'il vous plaît noter qu'un ISN dictionnaire 't une liste.

Cependant, vous pouvez bien sûr ajouter des valeurs à un membre statique à tout moment. Il ne doit pas être défini au moment de la compilation:

public class SomeOtherClass 
{ 
    public void SomeNonStaticMethod(Guid key, string subUrl) 
    { 
     ScraperMasterUriDetails.MasterUriDetails[key] = "http://www.helpmeimstuckinsideasadnsserver.com/" + subUrl; 
    } 
} 

Si vous avez besoin de plus d'informations que cela, s'il vous plaît décrire la structure que vous avez utilisé pour « ajouter un int ». Si vous rencontrez des problèmes pour définir cette structure, veuillez expliquer ce que vous voulez que votre dictionnaire fasse. Vous lui passez un GUID, et récupérez quelles informations?

+0

Merci pour la réponse, comme mentionné ci-dessus mon post a été édité, et il se lit que je veux vraiment utiliser un dictionnaire qui n'est pas le cas. Je veux juste quelque chose de similaire à mon exemple édité ci-dessus, mais dans un contexte statique. Un grand merci pour la réponse. – Ash

+0

Salut, merci encore pour l'exemple, je ne peux pas utiliser les initialiseurs car les valeurs que je veux stocker sont générées après traitement dans une classe. Aussi la classe WebsiteTitle était juste un exemple de la façon dont je déclare une liste personnalisée, je n'utilise toujours que ScraperMasterUriDetails et je veux stocker un Guid, string et int. – Ash

+0

@Ash: Vous pouvez utiliser un constructeur statique, ou juste avoir votre classe liée (qui a le code .Add()) modifier directement la variable statique. La variable statique ne signifie pas immuable, cela signifie simplement qu'elle n'est pas liée à une instance spécifique. –

1

Un constructeur statique est appelé automatiquement, et non par vous. Il n'y a aucun moyen de savoir quels paramètres passer.

Alors, que ce soit

  1. Définissez les propriétés des valeurs dans le constructeur
  2. ensuite les mettre avec une autre méthode que vous ajoutez par exemple Initialiser (int a, ...)
+0

+1. Si vous construisez simplement MasterUriDetails, utilisez un constructeur statique. Cela rend évident ce que vous essayez de faire. –

Questions connexes