1.什么是特性?
特性本身并没有任何意义,但是可以通过反射来进行获取
2.新建一个Attribute
public class RemarkAttribute : Attribute
{
public RemarkAttribute(string remark)
{
Remark = remark;
}
public string Remark { get; set; }
}
3.分别在枚举、类、属性、方法上应用特性
public enum CategoryEnum
{
[Remark("苹果")]
Apple = 0,
[Remark("香蕉")]
Banana = 1,
[Remark("梨子")]
Pear = 2
}
[Remark("水果")]
public class Fruit
{
[Remark("苹果")]
public string Apple { get; set; }
[Remark("香蕉")]
public string Banana { get; set; }
[Remark("梨子")]
public string Pear { get; set; }
[Remark("获取水果")]
public void GetAppleFruit(CategoryEnum category)
{
var name = Enum.GetName(category);
var field = category.GetType().GetField(name);
if (field != null)
{
var attr = field.GetCustomAttribute<RemarkAttribute>();
Console.WriteLine($"获取到:{attr.Remark}");
}
}
}
4.通过枚举、类、属性、方法获取特性
static void Main(string[] args)
{
//根据枚举获取特性
var type = typeof(CategoryEnum);
Enum.GetNames(type).ToList().ForEach(name =>
{
var field = type.GetField(name);
var attr = field.GetCustomAttribute<RemarkAttribute>();
if (attr != null)
{
Console.WriteLine($"枚举获取特性:{field.GetValue(type)}-{attr.Remark}");
}
});
//根据类获取特性
var fruitType = typeof(Fruit);
var fruitAttr = fruitType.GetCustomAttribute<RemarkAttribute>();
Console.WriteLine($"类获取特性:{fruitType.Name} {fruitAttr.Remark}");
//根据属性获取特性
var properties = fruitType.GetProperties();
foreach (var property in properties)
{
var attr = property.GetCustomAttribute<RemarkAttribute>();
if (attr != null)
{
Console.WriteLine($"属性获取特性:{property.Name} {attr.Remark}");
}
}
//根据方法获取特性
var methods = fruitType.GetMethods();
foreach (var method in methods)
{
var attr = method.GetCustomAttribute<RemarkAttribute>();
if (attr != null)
{
Console.WriteLine($"方法获取特性:{method.Name} {attr.Remark}");
}
}
Console.ReadKey();
}