我需要能够从我的方法中读取属性的值,我该怎么做?
[MyAttribute("Hello World")]
public void MyMethod()
{
// Need to read the MyAttribute attribute and get its value
}
答案 0 :(得分:72)
您需要在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");
答案 1 :(得分:29)
[MyAttribute("Hello World")]
public int MyMethod()
{
var myAttribute = GetType().GetMethod("MyMethod").GetCustomAttributes(true).OfType<MyAttribute>().FirstOrDefault();
}
答案 2 :(得分:16)
可用的答案大多已过时。
这是目前的最佳做法:
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>
获取一种类型的所有属性。
答案 3 :(得分:0)
如果在构造中将默认属性值存储到属性(我的示例中为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);
我的解决方案基于在属性构造上设置默认值,如下所示:
internal class MyAttribute : Attribute
{
public string Name { get; set; }
public MyAttribute(string name)
{
Name = name;
}
}
答案 4 :(得分:0)
如果您要实现上述@Mikael Engver之类的设置,并允许多次使用。这是您可以获取所有属性值的列表的方法。
[AttributeUsage(AttributeTargets.Method, AllowMultiple = true)]
public class TestCase : Attribute
{
public TestCase(string value)
{
Id = value;
}
public string Id { get; }
}
public static IEnumerable<string> AutomatedTests()
{
var assembly = typeof(Reports).GetTypeInfo().Assembly;
var methodInfos = assembly.GetTypes().SelectMany(m => m.GetMethods())
.Where(x => x.GetCustomAttributes(typeof(TestCase), false).Length > 0);
foreach (var methodInfo in methodInfos)
{
var ids = methodInfo.GetCustomAttributes<TestCase>().Select(x => x.Id);
yield return $"{string.Join(", ", ids)} - {methodInfo.Name}"; // handle cases when one test is mapped to multiple test cases.
}
}