/// 特性:中括号声明
///
/// 就是一个类直接/间接继承Attribute
///
/// 一般以Attribute结尾,声明时可以省略掉Attribute
///
/// 错觉:每一个特性都可以带来对应的功能
/// 实际上特性添加后,编译器会在元素内部产生IL,但无法直接使用,而且metadata里面会有记录
///
/// 任何一个生效的特性,都是主动去使用的
///
/// 特性:本身是没有用的
/// 程序运行过程中能够找到这些特性,
/// 没有破坏类的封装下,可以添加额外的信息和行为
// [Obsolete("请不要使用这个了,应该使用哪个", false)]//影响编译器运行
[Custom(123, Description = "1234", m_Remark = "3242")]//方法不行 实际上实例化对象
class Person
{
[Custom(1, Description = "ID property", m_Remark = "属性")]
public int ID { get; set; }
[Length(1,3)]
public string Name { get; set; }
[Long(111,10000000000)]
public long QQ { get; set; }
[Custom]
public void Study()
{
Console.WriteLine($"这里是{this.Name}");
}
[Custom()]//方法加特性
[return:Custom()]//返回值加特性
public string Ansewer([CustomAttribute]string name)//给形参加特性
{
return $"This is {name}";
}
}
//AttributeTargets 指定修饰什么元素 AllowMultiple是否可重复修饰 默认:false Inherited:是否可继承下去 默认:true
[AttributeUsage(AttributeTargets.All, AllowMultiple = false,Inherited = true)]//允许重复修饰
public class CustomAttribute:Attribute
{
public CustomAttribute() { }
public CustomAttribute(int n) { }
public string Description { get; set; }
public string m_Remark = null;
public void Show() { }
}
public static class ValidateExtension
{
public static bool Validate(this object oObject)
{
Type type = oObject.GetType();
foreach (var item in type.GetProperties())
{
if (item.IsDefined(typeof(AbstractValidateAttribute),true))
{
object[] objectAttributArray = item.GetCustomAttributes(typeof(AbstractValidateAttribute), true);
foreach (var attribute in objectAttributArray)
{
AbstractValidateAttribute abstractValidateAttribute = (AbstractValidateAttribute)attribute;
if (!abstractValidateAttribute.Validate(item.GetValue(oObject)))
{
return false;
}
}
}
}
return true;
}
}
[AttributeUsage(AttributeTargets.Property | AttributeTargets.Field)]
public abstract class AbstractValidateAttribute: Attribute
{
public abstract bool Validate(object value);
}
public class LongAttribute: AbstractValidateAttribute
{
private long _Min = 0;
private long _Max = 0;
public LongAttribute(long min, long max)
{
this._Min = min;
this._Max = max;
}
public override bool Validate(object value)
{
long longResult = 0;
if (value == null || string.IsNullOrEmpty(value.ToString()))
{
return false;
}
if (!long.TryParse(value.ToString(), out longResult))
{
return false;
}
if (longResult < this._Min || longResult > this._Max)
{
return false;
}
return true;
}
}
public class LengthAttribute: AbstractValidateAttribute
{
private int _Min = 0;
private int _Max = 0;
public LengthAttribute(int min,int max)
{
this._Min = min;
this._Max = max;
}
public override bool Validate(object value)
{
if (value == null || string.IsNullOrEmpty(value.ToString()))
{
return false;
}
int nLength = value.ToString().Length;
if (nLength < this._Min || nLength > _Max)
{
return false;
}
return true;
}
}
///
/// 用户状态
///
public enum UserState
{
[RemarkAttribute("正常")]
Normal=0,//正常
[RemarkAttribute("冻结")]
Frozen,//冻结
[RemarkAttribute("已删除")]
Deleted//已删除
}
public class RemarkAttribute:Attribute
{
private string _Remark = null;
public RemarkAttribute(string strRemark)
{
this._Remark = strRemark;
}
public string getRemark()
{
return this._Remark;
}
}
public static class RemarkExtension
{
public static string GetRemark(this Enum value)//this 关键字代表扩展方法 静态类的 静态的方法 this关键字
{
Type type = value.GetType();
FieldInfo fieldInfo = type.GetField(value.ToString());
if (fieldInfo.IsDefined(typeof(RemarkAttribute),true))
{
RemarkAttribute remarkAttribute = (RemarkAttribute)fieldInfo.GetCustomAttribute(typeof(RemarkAttribute), true);
return remarkAttribute.getRemark();
}
else
{
return value.ToString();
}
}
}
public static void Show(Person person)
{
//获取类上
Type type = typeof(Person);//等价 person.GetType()
//访问特性
if (type.IsDefined(typeof(CustomAttribute),true))
{
//通过反射,创建对象
CustomAttribute customAttribute = (CustomAttribute)type.GetCustomAttribute(typeof(CustomAttribute), true);
Console.WriteLine($"{customAttribute.Description}_{customAttribute.m_Remark}");
customAttribute.Show();
}
//获取Property
Console.WriteLine("获取Property");
PropertyInfo propertyInfo = type.GetProperty("ID");
if (propertyInfo.IsDefined(typeof(CustomAttribute), true))
{
CustomAttribute customAttribute = (CustomAttribute)propertyInfo.GetCustomAttribute(typeof(CustomAttribute), true);
Console.WriteLine($"{customAttribute.Description}_{customAttribute.m_Remark}");
customAttribute.Show();
}
//获取方法
Console.WriteLine("获取方法");
MethodInfo methodInfo = type.GetMethod("Ansewer");
if (methodInfo.IsDefined(typeof(CustomAttribute), true))
{
CustomAttribute customAttribute = (CustomAttribute)methodInfo.GetCustomAttribute(typeof(CustomAttribute), true);
Console.WriteLine($"{customAttribute.Description}_{customAttribute.m_Remark}");
customAttribute.Show();
}
//获取参数列表
ParameterInfo parameterInfo = methodInfo.GetParameters()[0];
if (parameterInfo.IsDefined(typeof(CustomAttribute), true))
{
CustomAttribute customAttribute = (CustomAttribute)parameterInfo.GetCustomAttribute(typeof(CustomAttribute), true);
Console.WriteLine($"{customAttribute.Description}_{customAttribute.m_Remark}");
customAttribute.Show();
}
//获取方法返回值
ParameterInfo parameterInfoReturn = methodInfo.ReturnParameter;
if (parameterInfoReturn.IsDefined(typeof(CustomAttribute), true))
{
CustomAttribute customAttribute = (CustomAttribute)parameterInfoReturn.GetCustomAttribute(typeof(CustomAttribute), true);
Console.WriteLine($"{customAttribute.Description}_{customAttribute.m_Remark}");
customAttribute.Show();
}
if(person.Validate())
{
Console.WriteLine("正确");
}
else
{
Console.WriteLine("错误");
}
person.Study();
string strResult = person.Ansewer("Mario");
}