C# - 反射动态添加/删除Attribute特性
API:
TypeDescriptor.AddAttributes
TypeDescriptor.GetAttributes
注意:TypeDescriptor.AddAttributes添加的特性需要使用 TypeDescriptor.GetAttributes获取
根据api可以看到,该接口不仅可以给指定类(Type)添加特性,还能给其他任意object类型对象添加特性
添加:
public class DynamicCacheBufferAtrribute : Attribute
{
public int Value;
public DynamicCacheBufferAtrribute(int v)
{
Value = v;
}
}
public class MyClass1
{
}
public class MyClass2
{
public MyClass1 Class1Obj;
}
//需要添加的特性集
var attributes = new Attribute[]
{
new DynamicCacheBufferAtrribute(123)
};
//给 MyClass1 类型添加、获取特性
TypeDescriptor.AddAttributes(typeof(MyClass1), attributes);
var attr = TypeDescriptor.GetAttributes(typeof(MyClass1))[typeof(DynamicCacheBufferAtrribute)] as DynamicCacheBufferAtrribute;
//var attr = TypeDescriptor.GetAttributes(field).OfType<DynamicCacheBufferAtrribute>().FirstOrDefault();
//给类对象添加、获取特性
var class1Inst = new MyClass1();
TypeDescriptor.AddAttributes(class1Inst , attributes);
var attr = TypeDescriptor.GetAttributes(class1Inst)[typeof(DynamicCacheBufferAtrribute)] as DynamicCacheBufferAtrribute;
//给FieldInfo添加、获取特性
var class2Inst = new MyClass2();
class2Inst.Class1Obj = new MyClass1();
var fieldInfo = class2Inst.GetType().GetField("Class1Obj");
TypeDescriptor.AddAttributes(fieldInfo, attributes);
var attr = TypeDescriptor.GetAttributes(fieldInfo)[typeof(DynamicCacheBufferAtrribute)] as DynamicCacheBufferAtrribute;
//给PropertyInfo添加、获取特性
var class2Inst = new MyClass2();
class2Inst.Class1Obj = new MyClass1();
var propertyInfo = class2Inst.GetType().GetProperty("Class1Obj");
TypeDescriptor.AddAttributes(propertyInfo, attributes);
var attr = TypeDescriptor.GetAttributes(propertyInfo)[typeof(DynamicCacheBufferAtrribute)] as DynamicCacheBufferAtrribute;
//其他object类型均可
删除:
//清空MyClaas1类型的所有DynamicCacheBufferAtrribute特性
var attrs = TypeDescriptor.GetAttributes(typeof(MyClass1)).OfType<DynamicCacheBufferAtrribute>().ToArray();
ArrayUtility.Clear(ref attrs);
TypeDescriptor.AddAttributes(typeof(MyClass1), attrs);
附加API解释:
TypeDescriptor.GetProperties(object)获取对象的特性
如果对象是一个属性(Property)
那么需要使用一下方式获取其特性
TypeDescriptor.GetProperties(belongClassType)[propertyName].Attributes
// 假设我们有一个类和一个特性 public class MyClass { [MyAttribute] public int MyProperty { get; set; } } public class MyAttribute : Attribute { } // 获取类的特性 MyClass myClass = new MyClass(); AttributeCollection attributes = TypeDescriptor.GetAttributes(myClass); // 获取属性的特性 PropertyDescriptor propertyDescriptor = TypeDescriptor.GetProperties(typeof(MyClass))["MyProperty"]; AttributeCollection propertyAttributes = propertyDescriptor.Attributes;
原文地址:https://blog.csdn.net/smile_otl/article/details/137913064
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!