C# 查找出有某个特性的属性并获取它的值。

2023-09-01 08:08:49 浏览数 (1)

代码语言: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}");
        }
    }
}

0 人点赞