反射,从伙伴类中获取DataAnnotation属性

Fer*_*ryt 4 .net reflection attributes

我需要检查属性是否在其伙伴类中定义了特定属性:

[MetadataType(typeof(Metadata))]
public sealed partial class Address
{
    private sealed class Metadata
    {
        [Required]
        public string Address1 { get; set; }

        [Required]
        public string Zip { get; set; }
    }
}
Run Code Online (Sandbox Code Playgroud)

如何检查哪些属性已定义Required属性?

谢谢.

Eli*_*sha 8

可以使用嵌套类型的探索来完成:

public IEnumerable<PropertyInfo> GetRequiredProperties()
{
    var nestedTypes = typeof(Address).GetNestedTypes(BindingFlags.NonPublic);

    var nestedType = nestedTypes.First(); // It can be done for all types

    var requiredProperties =
        nestedType.GetProperties()
            .Where(property => 
                           property.IsDefined(typeof(RequiredAttribute), false));

    return requiredProperties;
}
Run Code Online (Sandbox Code Playgroud)

用法示例:

[Test]
public void Example()
{
    var requiredProperties = GetRequiredProperties();
    var propertiesNames = requiredProperties.Select(property => property.Name);

    Assert.That(propertiesNames, Is.EquivalentTo(new[] { "Address1", "Zip" }));
}
Run Code Online (Sandbox Code Playgroud)