C# 如何从另一个 class 访问静态 class List<>

C# How to access static class List<> from another class

使用 C#,我有一个静态 class,它有一个自定义类型的静态列表。这是自定义类型:

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

这里是使用这种类型的静态class:

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

我想做的是使用来自另一个 class 的列表到 return 列表中的项目。我想指定 Name 并且我想取回 Id

我试过用这个:

using Word = Microsoft.Office.Interop.Word;

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

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

但是我得到一个编译错误,内容为:

'LanguageList' does not contain a definition for 'Single'

我试图查看其他类似的post,例如 and How to access member of a static class which is inside another static class等,但我无法根据这些得出结论。

这也是我使用硬编码枚举的原因,因为如果我使用 COM 对象 Office.Interop.Word,则需要很长时间(超过 2 分钟)才能将所有 250 多个项目添加到列表中。

有人可以帮我指出我做错了什么以及为什么我不能访问该列表,或者是否有更好的方法?提前致谢。

我觉得你的做法不合适

如果您要对列表进行硬编码,那么为什么会有 setter?此外,列表应该是不可变的,对吗?

我相信这会更好地满足您的需求:

    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));
    }
}
来自 System.Linq

.Single(...) 是一种扩展方法,但您试图将其用作 LanguageList.

上的静态方法

如果要使用 LINQ 方法,则需要对实际列表对象进行操作,而不是 class - LanguageList.LanguageListItems.

LanguageList.LanguageListItems.Single(...).

此外,由于它是静态的 class,从 List<T> 的继承是无关紧要的,可能会被删除。

1) 您不能使用 .Single(),因为 LanguageList 是 class,而不是实现 IEnumerable< T > 的 class 的实例。如果你这样做,它应该会起作用:

new LanguageList().GetLanguageList.Single();

但实际上不要那样做。 GetLanguageList 没有理由成为实例成员;它应该是静态的。

2) 你不应该公开语言列表,假设它是 immutable.

3) 您可能应该为您的语言 table 使用字典。它会更有效一点,并且在构造期间强制执行唯一性,而不是在每次查找期间执行。

4) 将静态语言访问器添加到 LanguageList(假设是 Dictionary<>):

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