2

こんにちは、コントローラーを介してモデルのカスタム属性の値を取得する簡単な方法があるかどうか疑問に思っています。議論のために...私のモデルにこれがあるとしましょう:

[DisplayName("A name")]
public string test;

私のコントローラーでは、次のようなものを使用して「A name」を取得したいと考えています。

ModelName.test.Attributes("DisplayName").value

それは空想的なものですか?

前もって感謝します。
WML

4

3 に答える 3

3

これは、属性から値を取得する方法に関する良い記事です。反省以外にこれを行う方法はないと思います。

記事から(例の属性タイプを変更するだけです:)):

   public static void PrintAuthorInfo(Type t) 
   {
      Console.WriteLine("Author information for {0}", t);
      Attribute[] attrs = Attribute.GetCustomAttributes(t);
      foreach(Attribute attr in attrs) 
      {
         if (attr is Author) 
         {
            Author a = (Author)attr;
            Console.WriteLine("   {0}, version {1:f}",
a.GetName(), a.version);
         }
      }
   }
于 2012-04-19T03:58:33.237 に答える
1

これを試して:

var viewData = new ViewDataDictionary<MyType>(/*myTypeInstance*/);
string testDisplayName = ModelMetadata.FromLambdaExpression(t => t.test, viewData).GetDisplayName();
于 2012-04-19T04:27:50.533 に答える
1

反射で簡単にできます。コントローラーの内部:

 public void TestAttribute()
    {
        MailJobView view = new MailJobView();
        string displayname = view.Attributes<DisplayNameAttribute>("Name") ;


    }

拡大:

   public static class AttributeSniff
{
    public static string Attributes<T>(this object inputobject, string propertyname) where T : Attribute
    {
        //each attribute can have different internal properties
        //DisplayNameAttribute has  public virtual string DisplayName{get;}
        Type objtype = inputobject.GetType();
        PropertyInfo propertyInfo = objtype.GetProperty(propertyname);
        if (propertyInfo != null)
        {
            object[] customAttributes = propertyInfo.GetCustomAttributes(typeof(T), true);

            // take only publics and return first attribute
            if (propertyInfo.CanRead && customAttributes.Count() > 0)
            {
                //get that first one for now

                Type ourFirstAttribute = customAttributes[0].GetType();
                //Assuming your attribute will have public field with its name
                //DisplayNameAttribute will have DisplayName property
                PropertyInfo defaultAttributeProperty = ourFirstAttribute.GetProperty(ourFirstAttribute.Name.Replace("Attribute",""));
                if (defaultAttributeProperty != null)
                {
                    object obj1Value = defaultAttributeProperty.GetValue(customAttributes[0], null);
                    if (obj1Value != null)
                    {
                        return obj1Value.ToString();
                    }
                }

            }

        }

        return null;
    }

}

私はそれがうまく動作することをテストしました。そのプロパティの最初の属性を使用します。MailJobView クラスには、DisplayNameAttribute を持つ「Name」という名前のプロパティがあります。

于 2012-04-19T04:45:05.383 に答える