2013-10-11 87 views
2

內最近我發現自己寫的類似於類很多:訪問「這個」靜態代碼塊

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()顯然不工作(出於某種原因)靜態。

+4

僅供參考 - 你應該使用'ToList()'在這裏'IEnumerable'序列......否則,每次調用將通過反射再次運行。 –

回答

2

有沒有什麼辦法可以在沒有特別需要調用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();     
    }); 
+0

我發現它真的很愚蠢,它必須這樣 –

+0

@ChrisMarisic'this'指的是C#中的一個實例。這將不得不有一些其他的關鍵字,但只是沒有在語言... –

+0

我明白,我只是不同意它。這在靜態範圍內應該引用這個實例,這個實例是靜態的。 –

0

做一個私有的構造,讓你一個(私人控股)參考。

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

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

或者你可以有構造函數調用的GetType(),只是用這個來代替調用_instance.GetType()每次你需要它的時候。

0

如果你喜歡的語義,你可以這樣做:

private static readonly Type _thisType = typeof(MyTypeCodes); 

// use like 
var typeCodes = _thisType.GetFields(...