3

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

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

如果您注意到其中的内容 ,即使我在 MyTypeCodes 类中new Lazy<IEnumerable<MyTypeCode>>(() =>,我也特别需要这样做。typeof(MyTypeCodes)有没有什么方法可以写这个而不需要特别调用typeof()我所在的类?如果这是一种常规方法,我会this.GetType()(由于某种原因)显然不适用于静力学。

4

3 回答 3

3

有什么方法可以写这个而不需要专门为我所在的类调用 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();                 
    });
于 2013-10-11T18:00:10.520 回答
0

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

private MyTypeCodes() { }
private static MyTypeCodes _instance = new MyTypeCodes();

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

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

于 2013-10-11T18:26:51.567 回答
0

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

private static readonly Type _thisType = typeof(MyTypeCodes);

// use like
var typeCodes = _thisType.GetFields(...
于 2013-10-11T18:53:39.053 回答