读取方法属性的值
我需要能够从我的方法中读取我的属性的值,我该怎么做?
[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; } }