首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >访问静态代码块内部的"this“

访问静态代码块内部的"this“
EN

Stack Overflow用户
提问于 2013-10-11 17:55:51
回答 3查看 364关注 0票数 3

最近,我发现自己写了很多类似于:

代码语言:javascript
复制
public class MyTypeCodes
{
    public static MyTypeCode E = new MyTypeCode{ Desc= "EEE", Value = "E" };
    public static MyTypeCode I = new MyTypeCode { Desc= "III", Value = "I" };

    private static readonly Lazy<IEnumerable<MyTypeCode>> AllMyTypeCodes =
        new Lazy<IEnumerable<MyTypeCode>>(() =>
        {
            var typeCodes = typeof(MyTypeCodes)
                 .GetFields(BindingFlags.Static | BindingFlags.Public)
                 .Where(x => x.FieldType == typeof (MyTypeCode))
                 .Select(x => (MyTypeCode) x.GetValue(null))
                 .ToList();

                 return typeCodes;
        });

    public static IEnumerable<MyTypeCode> All
    {
        get { return AllMyTypeCodes.Value; }
    }
}

如果您注意到在new Lazy<IEnumerable<MyTypeCode>>(() =>内部,我特别需要执行typeof(MyTypeCodes),即使我在MyTypeCodes类中。有什么方法可以不需要专门为我所在的类调用typeof()而编写这个类呢?如果这是一个常规的方法,我会this.GetType(),这显然是不工作(由于某种原因)的静力学。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-10-11 18:00:10

我是否可以在不需要专门为我的类调用the of ()的情况下编写这个类呢?

不,这可能是最好的选择。如果您知道永远不会添加任何其他类型的字段,则可以跳过Where子句。

此外,您应该使用ToList()来防止每次枚举时生成的IEnumerable<T>不得不重新运行:

代码语言:javascript
复制
private static readonly Lazy<IEnumerable<MyTypeCode>> AllMyTypeCodes =
    new Lazy<IEnumerable<MyTypeCode>>(() =>
    {
        return typeof(MyTypeCodes)
             .GetFields(BindingFlags.Static | BindingFlags.Public)
             // If you're not using any other fields, just skip this
             // .Where(x => x.FieldType == typeof (MyTypeCode ))
             .Select(x => (MyTypeCode) x.GetValue(null))
             .ToList();                 
    });
票数 3
EN

Stack Overflow用户

发布于 2013-10-11 18:26:51

创建一个私有构造函数,为您提供(私有)引用。

代码语言:javascript
复制
private MyTypeCodes() { }
private static MyTypeCodes _instance = new MyTypeCodes();

public static DoSomethingWithType()
{
  return _instance.GetType().foo();
}

或者,您可以让构造函数调用GetType()并使用它,而不是每次需要时调用_instance.GetType()。

票数 0
EN

Stack Overflow用户

发布于 2013-10-11 18:53:39

如果您更喜欢语义,您可以:

代码语言:javascript
复制
private static readonly Type _thisType = typeof(MyTypeCodes);

// use like
var typeCodes = _thisType.GetFields(...
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19324419

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档