繁体   English   中英

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

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

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

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

这是使用此类型的静态类:

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

我想做的是从另一个类使用此列表,以从列表中返回项目。 我想指定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”不包含“ Single”的定义

我尝试查看其他类似的文章,例如如何在C#中访问泛型静态类的所有特定版本? 以及如何访问位于另一个静态类和其他静态类内部的静态类的成员 ,但是我无法根据这些来弄清楚。

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

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

我认为您的方法不合适。

如果您要对列表进行硬编码,那么为什么要使用二传手? 另外,列表应该是不变的,对吗?

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

    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方法,则需要对实际的列表对象进行操作,而不是对LanguageList.LanguageListItems类进行操作。

LanguageList.LanguageListItems.Single(...)

此外,由于它是静态类,因此对List<T>的继承是不相关的,并且可能会被丢弃。

1)您不能使用.Single(),因为LanguageList是一个类,而不是实现IEnumerable <T>的类的实例。 如果您这样做,它应该可以工作:

new LanguageList().GetLanguageList.Single();

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

2)假定语言列表是不可变的,则不应公开语言列表。

3)您可能应该在语言表中使用Dictionary <字符串,Word.WdLanguageID>。 这样会更有效率,并且在构造过程中(而不是在每次查找过程中)强制执行唯一性。

4)在LanguageList中添加一个静态语言访问器(假设使用Dictionary <>):

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM