Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Select properties with specific attribute value

I'm looking for a way to select properties that have specific custom attributes with particular values in a single LINQ Statement.

I got the properties that have the attribute that I want, but I have no clue how to select its particular value.

<AttributeUsage(AttributeTargets.Property)>
Public Class PropertyIsMailHeaderParamAttribute
    Inherits System.Attribute

    Public Property HeaderAttribute As String = Nothing
    Public Property Type As ParamType = Nothing

    Public Sub New()

    End Sub

    Public Sub New(ByVal headerAttribute As String, ByVal type As ParamType)
        Me.HeaderAttribute = headerAttribute
        Me.Type = type
    End Sub

    Public Enum ParamType
        base = 1
        open
        closed
    End Enum
    End Class


    private MsgData setBaseProperties(MimeMessage mailItem, string fileName)
    {
        var msgData = new MsgData();
        Type type = msgData.GetType();
        var props = from p in this.GetType().GetProperties()
                    let attr = p.GetCustomAttributes(typeof(Business.IT._21c.AddonFW.PropertyIsMailHeaderAttribute), true)
                    where attr.Length == 1
                    select new { Property = p, Attribute = attr.FirstOrDefault() as Business.IT._21c.AddonFW.PropertyIsMailHeaderAttribute };
    }

[Solution]

var baseProps = from p in this.GetType().GetProperties()
                let attr = p.GetCustomAttribute<PropertyIsMailHeaderParamAttribute>()
                where attr != null && attr.Type == PropertyIsMailHeaderParamAttribute.ParamType.@base
select new { Property = p, Attribute = attr as Business.IT._21c.AddonFW.PropertyIsMailHeaderParamAttribute };
like image 733
OhSnap Avatar asked Jan 26 '26 17:01

OhSnap


1 Answers

You either have to cast the Attribute object (using a regular cast or by e.g. using the OfType<> extension) to your type, but the easiest way would be to use the generic version of GetCustomAttribute<>:

var props = from p in this.GetType().GetProperties()
            let attr = p.GetCustomAttribute<PropertyIsMailHeaderAttribute>()
            where attr != null && attr.HeaderAttribute == "FooBar"
                               && attr.Type = ParamType.open
            select whatever;
like image 169
sloth Avatar answered Jan 28 '26 10:01

sloth



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!