版权声明:未经本人允许,必须声明原文转载地址和作者! https://blog.csdn.net/liuchang19950703/article/details/87869036
一:C#【特性】的基本概念和调用特性
二:C#【特性】运用1-枚举解释
三:C#【特性】运用2-属性验证
1:调用类运行代码
public class Program
{
public static void Main(string[] args)
{
#region 特性
#region 特性调用-类,方法
//特性就是对类,方法,属性等的补充
AttribuDemo attDemo = new AttribuDemo { DId = 1001, DName = "MIke" };
//1.修饰【类】时获取特性类
new AttribuHelper().ShowAttributeByClass();
//2.修饰【方法】时获取特性类
new AttribuHelper().ShowAttributeByMethod();
attDemo.DShow();
Console.ReadKey();
#endregion
#region 特性运用1-枚举解释
Enum em = EnumDemo.SoSo;
string name = EnumClass.GetName(em);
Console.WriteLine(name);
Console.ReadKey();
#endregion
#region 特性运用2-属性验证
PropDemo prop = new PropDemo();
prop.ID = 1;
prop.QQ = 10;
bool result = AttribuProp.ValidaProp(prop);
Console.WriteLine($"{(result ? "成功" : "失败")}");
Console.ReadKey();
#endregion
#endregion
}
}
2:辅助类代码
(1)枚举解释运用-【AttribuEnum】类:
public class AttribuEnum : Attribute
{
public string _name = null;
public AttribuEnum(string name)
{
this._name = name;
}
}
(2)枚举解释运用-【EnumDemo】类
public enum EnumDemo
{
[AttribuEnum("优秀")]
Good = 1,
[AttribuEnum("一般")]
SoSo = 2,
[AttribuEnum("差")]
Bad = 3,
EnumDemo = 4
}
public static class EnumClass
{
public static string GetName(this Enum em)
{
Type type = em.GetType();
FieldInfo field = type.GetField(em.ToString());
if (field.IsDefined(typeof(AttribuEnum), true))
{
AttribuEnum attEnum = (AttribuEnum)field.GetCustomAttribute(typeof(AttribuEnum), true);
return attEnum._name;
}
return "";
}
}
(1)属性验证运用-【AttribuProp】类:
public static class AttribuProp
{
/// <summary>
/// 验证该对象是否符合该特性的验证
/// </summary>
/// <param name="obj"></param>
/// <returns></returns>
public static bool ValidaProp(this object obj)
{
Type type = obj.GetType();
foreach (PropertyInfo prop in type.GetProperties())
{
if (prop.IsDefined(typeof(AttribuAbstractProp), true))
{
foreach (var item in prop.GetCustomAttributes(typeof(AttribuAbstractProp), true))
{
AttribuAbstractProp abstractAttribu = (AttribuAbstractProp)item;
if (!abstractAttribu.ValidObj(obj))
{
return false;
}
}
}
}
return true;
}
}
/// <summary>
/// 虚方法特性
/// </summary>
[AttributeUsage(AttributeTargets.All, AllowMultiple = true, Inherited = true)]
public abstract class AttribuAbstractProp : Attribute
{
public abstract bool ValidObj(object obj);
}
/// <summary>
/// 验证数值大小的特性
/// </summary>
public class AttribuSize : AttribuAbstractProp
{
private long _min;
private long _max;
public AttribuSize(long min, long max)
{
_min = min;
_max = max;
}
public override bool ValidObj(object obj)
{
if (!string.IsNullOrWhiteSpace(obj.ToString()))
{
if (long.TryParse(obj.ToString(), out long result))
{
if (result >= _min && result <= _max)
{
return true;
}
}
}
return false;
}
}
(2)属性验证运用-【PropDemo】类:
public class PropDemo
{
public int ID { get; set; }
[AttribuSize(9999, 9999999)]
public long QQ { get; set; }
}