2016-05-07 1 views
2

En utilisant C#, j'ai une classe statique qui a une liste statique d'un type personnalisé. Voici le type personnalisé:C# Comment accéder à la classe statique List <> d'une autre classe

public class LanguageItem 
{ 
    public Word.WdLanguageID Id { get; set; } 
    public string Name { get; set; } 

    public LanguageItem(string name, int id) 
    { 
     Id = (Word.WdLanguageID)id; 
     Name = name; 
    } 
} 

Et voici la classe statique qui utilise ce type:

public static class LanguageList 
{    
    public static List<LanguageItem> _languageList; 

    static LanguageList() 
    { 
     _languageList.Add(new LanguageItem("Arabic", 1025)); 
     _languageList.Add(new LanguageItem("Bulgarian", 1026)); 
     _languageList.Add(new LanguageItem("Catalan", 1027)); 
     _languageList.Add(new LanguageItem("TraditionalChinese", 1028)); 
     _languageList.Add(new LanguageItem("Czech", 1029)); 
     _languageList.Add(new LanguageItem("Danish", 1030)); 
     _languageList.Add(new LanguageItem("German", 1031)); 
     _languageList.Add(new LanguageItem("Greek", 1032)); 
     _languageList.Add(new LanguageItem("EnglishUS", 1033)); 
     _languageList.Add(new LanguageItem("Spanish", 1034)); 
     _languageList.Add(new LanguageItem("Finnish", 1035)); 
     _languageList.Add(new LanguageItem("French", 1036)); 
     _languageList.Add(new LanguageItem("Hebrew", 1037)); 
     _languageList.Add(new LanguageItem("Hungarian", 1038)); 
     _languageList.Add(new LanguageItem("Icelandic", 1039)); 
     _languageList.Add(new LanguageItem("Italian", 1040)); 
     _languageList.Add(new LanguageItem("Japanese", 1041)); 
     _languageList.Add(new LanguageItem("Korean", 1042)); 
     _languageList.Add(new LanguageItem("Dutch", 1043)); 
    } 

    public static List<LanguageItem> LanguageListItems 
    { 
     get 
     { 
      return _languageList; 
     } 
     private set 
     { 
      _languageList = value; 
     } 
    } 
} 

Ce que je suis en train de faire est d'utiliser cette liste d'une autre classe, de retourner le la éléments de la liste. Je veux spécifier le Name et je veux récupérer le Id.

J'ai essayé d'utiliser:

using Word = Microsoft.Office.Interop.Word; 

Word.Application oWord = new Word.Application(); 

oWord.Selection.LanguageID = LanguageList.Single(lang => lang.Name == strTgtLanguage).Id; 

Mais je reçois une erreur de compilation qui lit:

'languageList' ne contient pas de définition pour 'unique'

J'ai essayé de regarder d'autres articles similaires, tels que How to access all specific versions of a generic static class in C#? et How to access member of a static class which is inside another static class et d'autres, mais je ne peux pas le comprendre sur la base de ceux-ci.

La raison pour laquelle j'utilise une énumération codée en dur, car si j'utilise l'objet COM Office.Interop.Word, il faut toujours (plus de 2 minutes) pour ajouter tous les 250+ éléments à la liste. Quelqu'un peut-il m'aider à faire remarquer ce que je fais de mal et pourquoi ne puis-je pas accéder à la liste, ou s'il y a une meilleure approche? Merci d'avance.

+1

Je suis vraiment curieux de voir comment ce code peut compiler lorsque votre classe statique hérite autre chose que 'object'. Il doit y avoir quelque chose qui me passe par la tête. –

+0

Bon point, mon mauvais, j'ai oublié de mettre à jour cela aussi. J'ai corrigé toutes les erreurs du compilateur, dont la plupart n'apparaissaient qu'au moment de la compilation. J'ai juste oublié de le mettre à jour ici. – ib11

+0

Tout va bien. Je l'ai vu et était tellement confus lol. –

Répondre

4

Je pense que votre approche n'est pas appropriée.

Si vous êtes en train de coder en dur la liste, alors pourquoi auriez-vous un setter? En outre, la liste devrait alors être immuable, correct?

Je crois que cela fonctionnerait mieux à vos besoins:

public static class LanguageList 
{ 
    private static readonly List<LanguageItem> _languageList = new List<LanguageItem>(new[] 
    { 
     new LanguageItem("Arabic", 1025), 
     new LanguageItem("Bulgarian", 1026), 
     new LanguageItem("Catalan", 1027), 
     new LanguageItem("TraditionalChinese", 1028), 
     new LanguageItem("Czech", 1029), 
     new LanguageItem("Danish", 1030), 
     new LanguageItem("German", 1031), 
     new LanguageItem("Greek", 1032), 
     new LanguageItem("EnglishUS", 1033), 
     new LanguageItem("Spanish", 1034), 
     new LanguageItem("Finnish", 1035), 
     new LanguageItem("French", 1036), 
     new LanguageItem("Hebrew", 1037), 
     new LanguageItem("Hungarian", 1038), 
     new LanguageItem("Icelandic", 1039), 
     new LanguageItem("Italian", 1040), 
     new LanguageItem("Japanese", 1041), 
     new LanguageItem("Korean", 1042), 
     new LanguageItem("Dutch", 1043), 
    }); 

     public static IEnumerable<LanguageItem> GetLanguages() 
    { 
     return _languageList; 
    } 

    public static LanguageItem GetLanguageItem(string languageName) 
    { 
     return _languageList.SingleOrDefault(li => li.Name.Equals(languageName)); 
    } 
} 
+0

Correct, je ne veux pas du tout modifier la liste du code. Alors, comment puis-je accéder à la liste puis d'une méthode d'une autre classe? Juste 'GetLanguages.Name'? – ib11

+0

IEnumerable est interrogeable avec LINQ. Un dictionnaire serait-il meilleur? –

+0

Non, aucune liste n'est simple et totalement fine, mais je me demandais sur l'expression eact LINQ, si elle devait être un LINQ même. – ib11

1

.Single(...) de System.Linq est une méthode d'extension, mais vous essayez de l'utiliser comme une méthode statique sur LanguageList.

Si vous souhaitez utiliser les méthodes LINQ, vous devez opérer sur l'objet liste réel, et non sur la classe LanguageList.LanguageListItems.

, c'est-à-dire LanguageList.LanguageListItems.Single(...).

De plus, comme il s'agit d'une classe statique, l'héritage de List<T> n'est pas pertinent et peut probablement être supprimé.

1

1) Vous ne pouvez pas utiliser .Single() car LanguageList est une classe, pas une instance d'une classe qui implémente IEnumerable < T>. Cela devrait fonctionner si vous faites:

new LanguageList().GetLanguageList.Single(); 

Mais ne le faites pas réellement. GetLanguageList n'a aucune raison d'être un membre d'instance; ça devrait être statique.

2) Vous ne devez pas exposer la liste des langues, à supposer qu'elle soit destinée à être immuable.

3) Vous devriez probablement utiliser une chaîne Dictionary <, Word.WdLanguageID> pour votre table de langues. Ce sera un peu plus efficace, et l'unicité est appliquée pendant la construction, pas pendant chaque recherche.

4) Ajouter un accesseur langue statique à languageList (en supposant un dictionnaire <>):

public static bool TryGetLanguageId(string name, out Word.WdLanguageID id) 
{ 
    return _languageList.TryGetValue(name, out id); 
}