代码语言:javascript复制
public class MyClass
{
[MyAttribute]
public string Property1 { get; set; } = "Value1";
public int Property2 { get; set; } = 42;
[MyAttribute]
public bool Property3 { get; set; } = true;
}
public class MyAttribute : Attribute { }
class Program
{
static void Main()
{
MyClass myInstance = new MyClass(); // 创建一个类实例
Type myClassType = typeof(MyClass);
var propertiesWithAttribute = myClassType.GetProperties()
.Where(prop => Attribute.IsDefined(prop, typeof(MyAttribute)))
.Select(prop => new { Name = prop.Name, Value = prop.GetValue(myInstance) });
foreach (var property in propertiesWithAttribute)
{
Console.WriteLine($"Property: {property.Name}, Value: {property.Value}");
}
}
}
在这个示例中,我们有一个 MyClass类,其中包含三个属性。其中两个属性被 MyAttribute特性修饰。使用反射,我们可以通过使用 Attribute.IsDefined 方法来过滤具有 MyAttribute特性的属性。然后,我们使用 Select 方法选择属性的名称和值,并将它们存储在匿名类型中。最后,我们遍历这些属性并打印它们的名称和值。请注意, MyAttribute 类是一个自定义的特性类,您可以根据需要进行定义。
程序里面经常要用。那就封装一个泛型方法。
代码语言:javascript复制public static class AttributeHelper
{
public static IEnumerable<PropertyInfo> GetPropertiesWithAttribute<TClass, TAttribute>()
where TClass : class
where TAttribute : Attribute
{
Type classType = typeof(TClass);
var propertiesWithAttribute = classType.GetProperties()
.Where(prop => Attribute.IsDefined(prop, typeof(TAttribute)));
return propertiesWithAttribute;
}
}
测试一下
代码语言:javascript复制public class MyClass
{
[MyAttribute]
public string Property1 { get; set; } = "Value1";
public int Property2 { get; set; } = 42;
[MyAttribute]
public bool Property3 { get; set; } = true;
}
public class MyAttribute : Attribute { }
class Program
{
static void Main()
{
var propertiesWithAttribute = AttributeHelper.GetPropertiesWithAttribute<MyClass, MyAttribute>();
foreach (var property in propertiesWithAttribute)
{
Console.WriteLine($"Property: {property.Name}");
}
}
}