2013-10-11 4 views
2

의 내부 요즘 나 자신과 비슷한 수업을 많이 쓰는 발견했습니다액세스 "이"정적 codeblocks

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

당신은 내가 특별히 내가 안으로 해요 비록 typeof(MyTypeCodes)을 할 필요가 new Lazy<IEnumerable<MyTypeCode>>(() =>의 내부에 통지하는 경우 MyTypeCodes 클래스 특히 내가 특별히 내부에있는 클래스에 대해 typeof()으로 전화 할 필요가 없어도 이것을 쓸 수있는 방법이 있습니까? 이것이 정상적인 방법이라면 나는 this.GetType()이 될 것입니다. 어떤 이유로 든 통계적으로 작동하지 않습니다.

+4

참고 - 당신은 ... 여기에'IEnumerable' 순서에()''ToList를 사용해야합니다 그렇지 않으면, 모든 호출을 다시 반사를 통해 실행됩니다. –

답변

2

구체적으로 typeof()를 호출 할 필요가 없으면이 방법을 사용할 수 있습니까?

아니요, 가장 적합한 옵션 일 수 있습니다. 다른 유형의 다른 필드를 절대로 추가하지 않으려는 경우 Where 절을 건너 뛸 수 있습니다.

또한, 당신은 그것을 열거 될 때마다 다시 실행하는 데에서 발생하는 IEnumerable<T>을 방지하기 위해 ToList()을 사용해야합니다

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(...