読者です 読者をやめる 読者になる 読者になる

XORveR.com の日記

XORveR.com の公式ブログです。

Linqのクエリ式を使ったプロパティ名の記述の提案

まえがき

blog.xorver.com

でも紹介している、クエリ式を使ったプロパティ名の記述は便利ですが、毎回拡張メソッドが呼ばれます。
わずかな問題だけど、気になります。

そこで、こうしたらどうだろう?という提案です。

ヘルパー

まず、以下のヘルパーを用意します。

    /// <summary>
    /// プロパティ名の調査用ヘルパー
    /// </summary>
    /// <typeparam name="TObj"></typeparam>
    public class Names<TObj> {
        /// <summary>
        /// 空オブジェクト
        /// </summary>
        public readonly TObj Null = default(TObj);
        /// <summary>
        /// プロパティ名
        /// </summary>
        /// <typeparam name="TProp">プロパティの型</typeparam>
        /// <param name="propertyNameExpression">プロパティ名を示すクエリ式</param>
        /// <returns>プロパティ名</returns>
        public string Name<TProp>(Expression<Func<TObj, TProp>> propertyNameExpression) {
            return Null.PropertyName<TObj, TProp>(propertyNameExpression);
        }
    }

実装部分

目的とするクラス内に Names という静的なサブクラスを書きます。
実例

    public class Parameter : INotifyPropertyChanged {
        public static class Names {
            private static Names<Parameter> names = new Names<Parameter>();
            public static readonly string Status = names.Name((o) => o.Status);
            public static readonly string Description = names.Name((o) => o.Description);
            public static readonly string Name = names.Name((o) => o.Name);
            public static readonly string ParameterEntryTime = names.Name((o) => o.ParameterEntryTime);
            public static readonly string ParameterUpdateTime = names.Name((o) => o.ParameterUpdateTime);
            public static readonly string SourceFullName = names.Name((o) => o.SourceFullName);
        }

静的メソッドの場合、上記「ひどい使い方」に従って、TObj は使いません。

    public class Texts {
        public static class Names {
            private static Names<Texts> names = new Names<Texts>();
            public static readonly string StaticCurrentSettingFolder = names.Name(o => CurrentSettingFolder);
            public static readonly string StaticCurrentCulture = names.Name(o => CurrentCulture);
        }

使用

「クラス.Names.プロパティ名」として記述します。

                ctrl.AddColumn(Strings.Column_Header_Description, new Binding(Parameter.Names.Description));

では!