0

プロパティ CountryText の値を表示するカスタム属性を作成しようとしています

[DisplayNameProperty("CountryText")]
    public string Country { get; set; }

    public string CountryText { get; set; }

これは属性のコードです

namespace Registration.Front.Web.Validators
    {
        public class RegistrationDisplayNameAttribute:DisplayNameAttribute
        {
            private readonly PropertyInfo _proprtyInfo;
            public RegistrationDisplayNameAttribute(string resourceKey):base(resourceKey)
            {

            }

            public override string DisplayName
            {
                get
                {
                    if(_proprtyInfo==null)

                }

            }
        }
    }

属性のコードで指定されたフィールドの値を取得するために反射を行うにはどうすればよいresourceKeyですか??

4

1 に答える 1

-1

コンストラクターを介してインスタンスを属性に渡すことはできないため (つまり、属性はコンパイル時にメタデータに含まれ、リフレクションを介して使用されます。クラスのインスタンスをパラメーターとして属性コンストラクターに渡すことができます) 。

インスタンスを渡すための回避策があり、それはコンストラクターで次のように行うことです。

  public class Foo
  {
    [RegistrationDisplayNameAttribute("MyProp2")]
    public string MyProp { get; set; }

    public string MyProp2 { get; set; }


    public Foo()
    {
      var atts = this.GetType().GetCustomAttributes();
      foreach (var item in atts)
      {
        if (atts is RegistrationDisplayNameAttribute)
        {
          ((RegistrationDisplayNameAttribute)atts).Instance = this;
        }
      }
    }
  }

そして DisplayName で次のことを行います。

public override string DisplayName
{
  get
  {
    var property = Instance.GetType().GetProperty(DisplayNameValue);
    return property.GetValue(Instance, null) as string;
  }

}

私はそのような方法をお勧めしません:(

于 2013-07-24T09:24:58.710 に答える