读取方法属性的值

我需要能够从我的方法中读取我的属性的值,我该怎么做?

[MyAttribute("Hello World")] public void MyMethod() { // Need to read the MyAttribute attribute and get its value } 

您需要在MethodBase对象上调用GetCustomAttributes函数。
获取MethodBase对象最简单的方法是调用MethodBase.GetCurrentMethod 。 (请注意,您应该添加[MethodImpl(MethodImplOptions.NoInlining)]

例如:

 MethodBase method = MethodBase.GetCurrentMethod(); MyAttribute attr = (MyAttribute)method.GetCustomAttributes(typeof(MyAttribute), true)[0] ; string value = attr.Value; //Assumes that MyAttribute has a property called Value 

您也可以手动获取MethodBase ,如下所示:(这会更快)

 MethodBase method = typeof(MyClass).GetMethod("MyMethod"); 
 [MyAttribute("Hello World")] public int MyMethod() { var myAttribute = GetType().GetMethod("MyMethod").GetCustomAttributes(true).OfType<MyAttribute>().FirstOrDefault(); } 

可用的答案大多是过时的。

这是目前的最佳做法:

 class MyClass { [MyAttribute("Hello World")] public void MyMethod() { var method = typeof(MyClass).GetRuntimeMethod(nameof(MyClass.MyMethod), new Type[]{}); var attribute = method.GetCustomAttribute<MyAttribute>(); } } 

这不需要铸造,使用起来非常安全。

您也可以使用.GetCustomAttributes<T>来获取一种types的所有属性。

如果将默认属性值存储到构造中的属性(在我的示例中为Name ),则可以使用静态属性辅助方法:

 using System; using System.Linq; public class Helper { public static TValue GetMethodAttributeValue<TAttribute, TValue>(Action action, Func<TAttribute, TValue> valueSelector) where TAttribute : Attribute { var methodInfo = action.Method; var attr = methodInfo.GetCustomAttributes(typeof(TAttribute), true).FirstOrDefault() as TAttribute; return attr != null ? valueSelector(attr) : default(TValue); } } 

用法:

 var name = Helper.GetMethodAttributeValue<MyAttribute, string>(MyMethod, x => x.Name); 

我的解决scheme是基于默认值设置属性的构造,如下所示:

 internal class MyAttribute : Attribute { public string Name { get; set; } public MyAttribute(string name) { Name = name; } }