访问静态代码块中的“this”

本文关键字:this 静态 代码 访问 | 更新日期: 2023-09-27 18:35:04

最近我发现自己写了很多类似于以下内容的类:

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)即使我在类 MyTypeCode 里。有什么方法可以编写它而无需特别为我专门所在的类调用typeof()?如果这是一种常规方法,我会this.GetType()显然(出于某种原因)不适用于静态。

访问静态代码块中的“this”

有什么方法可以编写它而无需特别需要为我专门在其中的类调用 typeof()?

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

此外,还应使用 ToList() 来防止生成的IEnumerable<T>在每次枚举时都必须重新运行:

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

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

private MyTypeCodes() { }
private static MyTypeCodes _instance = new MyTypeCodes();
public static DoSomethingWithType()
{
  return _instance.GetType().foo();
}

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

如果你更喜欢语义,你可以做:

private static readonly Type _thisType = typeof(MyTypeCodes);
// use like
var typeCodes = _thisType.GetFields(...