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

または、必要なたびに _instance.GetType() を呼び出す代わりに、コンストラクターで GetType() を呼び出してそれを使用することもできます。

于 2013-10-11T18:26:51.567 に答える