Reputation: 376
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 };
Upvotes: 3
Views: 2983
Reputation: 101072
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;
Upvotes: 8