访问自定义属性的值

我有这个自定义属性:

[AttributeUsage(AttributeTargets.Method, AllowMultiple=false, Inherited = true)] class MethodTestingAttibute : Attribute { public string Value{ get; private set; } public MethodTestingAttibute (string value) { this.Value= value; } } 

要像这样使用:

  [MethodTestingAttibute("2")] public int m1() {return 3; } 

而我的理念是采用MethodTestingAttibute的“2”值

 object result = method.Invoke(obj, new Type[] {}); // here i get the return 

现在我想将此结果与Method TestingAttibute的值进行比较。 我怎么能这样做? 我试图走上这条路,但没有成功:method.GetCustomAttributes(typeof(MethodTestAttibute),true)[0] …

什么是正确访问Custoum属性字段?

 var attribute = (MethodTestingAttibute) typeof (Vehicles) .GetMethod("m1") .GetCustomAttributes(typeof (MethodTestingAttibute), false).First(); Console.WriteLine(attribute.Value); 

请参阅以下链接,它获取枚举的属性,但您可以自定义是获取您的自定义属性。

获取Enum的属性

将对象MethodTestingAttibuteMethodTestingAttibute

 object actual = method.Invoke(obj, null); MethodTestingAttibute attribute = (MethodTestingAttibute)method.GetCustomAttributes(typeof(MethodTestAttribute), true)[0]; string expected = attribute.Value; bool areEqual = string.Equals(expected, actual != null ? actual.ToString() : null, StringComparison.Ordinal); 

请查看此处的代码http://msdn.microsoft.com/en-us/library/bfwhbey7.aspx

摘抄:

  // Get the AClass type to access its metadata. Type clsType = typeof(AClass); // Get the type information for Win32CallMethod. MethodInfo mInfo = clsType.GetMethod("Win32CallMethod"); if (mInfo != null) { // Iterate through all the attributes of the method. foreach(Attribute attr in Attribute.GetCustomAttributes(mInfo)) { // Check for the Obsolete attribute. if (attr.GetType() == typeof(ObsoleteAttribute)) { Console.WriteLine("Method {0} is obsolete. " + "The message is:", mInfo.Name); Console.WriteLine(" \"{0}\"", ((ObsoleteAttribute)attr).Message); } // Check for the Unmanaged attribute. else if (attr.GetType() == typeof(UnmanagedAttribute)) { Console.WriteLine( "This method calls unmanaged code."); Console.WriteLine( String.Format("The Unmanaged attribute type is {0}.", ((UnmanagedAttribute)attr).Win32Type)); AClass myCls = new AClass(); myCls.Win32CallMethod(); } } } 

使用我的自定义属性:

 [AttributeUsage(AttributeTargets.Method)] public class AttributeCustom : Attribute { public string MyPropertyAttribute { get; private set; } public AttributeCustom(string myproperty) { this.MyPropertyAttribute = myproperty; } } 

我创建了一个获取属性的方法:

 public static AttributeCustom GetAttributeCustom(string method) where T : class { try { return ((AttributeCustom)typeof(T).GetMethod(method).GetCustomAttributes(typeof(AttributeCustom), false).FirstOrDefault()); } catch(SystemException) { return null; } } 

使用示例类(必须不是静态的,因为T是通用的)

 public class MyClass { [AttributeCustom("value test attribute")]) public void MyMethod() { //... } } 

用法:

 var customAttribute = GetAttributeCustom("MyMethod"); if (customAttribute != null) { Console.WriteLine(customAttribute.MyPropertyAttribute); } 

要获取属性属性的值,只需转换GetCustomAttributes()返回的对象:

 { string val; object[] atts = method.GetCustomAttributes(typeof(MethodTestAttibute), true); if (atts.Length > 0) val = (atts[0] as MethodTestingAttibute).Value; } 

Necromancing。
对于那些仍然需要维护.NET 2.0的用户,或那些想要在没有LINQ的情况下做到这一点的人:

 public static object GetAttribute(System.Reflection.MemberInfo mi, System.Type t) { object[] objs = mi.GetCustomAttributes(t, true); if (objs == null || objs.Length < 1) return null; return objs[0]; } public static T GetAttribute(System.Reflection.MemberInfo mi) { return (T)GetAttribute(mi, typeof(T)); } public delegate TResult GetValue_t(T arg1); public static TValue GetAttributValue(System.Reflection.MemberInfo mi, GetValue_t value) where TAttribute : System.Attribute { TAttribute[] objAtts = (TAttribute[])mi.GetCustomAttributes(typeof(TAttribute), true); TAttribute att = (objAtts == null || objAtts.Length < 1) ? default(TAttribute) : objAtts[0]; // TAttribute att = (TAttribute)GetAttribute(mi, typeof(TAttribute)); if (att != null) { return value(att); } return default(TValue); } 

用法示例:

 System.Reflection.FieldInfo fi = t.GetField("PrintBackground"); wkHtmlOptionNameAttribute att = GetAttribute(fi); string name = GetAttributValue(fi, delegate(wkHtmlOptionNameAttribute a){ return a.Name;}); 

或者在你的情况下

 MethodInfo mi = typeof(Vehicles).GetMethod("m1"); string aValue = GetAttributValue(mi, a => a.Value);