C# 正在检查传递给`AttributeUsageAttribute`构造函数的参数

C# 正在检查传递给`AttributeUsageAttribute`构造函数的参数,c#,.net,roslyn,C#,.net,Roslyn,我想检查属性类型是否应用了AttributeUsage属性,以及AttributeTargets.Class是否传递给AttributeUsage构造函数。以下是我为执行检查而编写的代码: bool CheckSomeArbitraryConditionMet(AttributeData attributeData) { AttributeData[] attributeUsages = attributeData.AttributeClass.GetAttributes

我想检查属性类型是否应用了
AttributeUsage
属性,以及
AttributeTargets.Class
是否传递给
AttributeUsage
构造函数。以下是我为执行检查而编写的代码:

bool CheckSomeArbitraryConditionMet(AttributeData attributeData)
{
    AttributeData[] attributeUsages =
        attributeData.AttributeClass.GetAttributes().Where(
            a => a.AttributeClass.Name == "AttributeUsageAttribute").ToArray();

    if (attributeUsages.Any())
    {
        return
            attributeUsages.Any(
                a =>
                    a.ConstructorArguments.Any(constant => constant.Value != null && constant.Value.ToString().Contains("AttributeTargets.Class"))
                    || a.NamedArguments.Any(kvp => kvp.Value.ToString().Contains("AttributeTargets.Class")));
    }
    return true;
}
我有一个属性如下:

[AttributeUsage(AttributeTargets.Class|AttributeTargets.Struct|AttributeTargets.Method)]
public class MyAttribute : System.Attribute
{
}
当我将表示
MyAttribute
AttributeData
对象传递给上面定义的
checkSomeArricConditionMet(AttributeData)
方法时,该方法返回
false
而不是
true

我在
if(attributeUsages.Any())
行上设置了一个断点,并在
即时窗口中执行了以下代码:

var attribute = attributeUsages.Single();
Expression has been evaluated and has no value
var constructorArguments = attribute.ConstructorArguments;
Expression has been evaluated and has no value
var argument = constructorArguments.Single();
Expression has been evaluated and has no value
var argumentValue = argument.Value;
Expression has been evaluated and has no value
var argumentValueString = argumentValue.ToString();
Expression has been evaluated and has no value
以下是我检查
Locals
窗口时它们的值:

如您所见,
argumentValue
76
argumentValueString
“76”
。因此,难怪
checksomeartualconditionmet(AttributeData)
方法返回
false

如何检查是否将
AttributeTargets.Class
传递给
AttributeUsage
构造函数?

我将上的示例作为灵感,并将
CheckSomeArrityConditionMet(AttributeData)
的实现修改为:

bool CheckSomeArbitraryConditionMet(AttributeData attributeData)
{
    AttributeData[] attributeUsages =
        attributeData.AttributeClass.GetAttributes().Where(
            a => a.AttributeClass.Name == "AttributeUsageAttribute").ToArray();

    if (attributeUsages.Any())
    {
        return
            attributeUsages.Any(
                attributeUsage =>
                    attributeUsage.ConstructorArguments.Any(
                        arg =>
                        {
                            string argValue = arg.Value.ToString();

                            return
                                arg.Kind == TypedConstantKind.Enum
                                && arg.Type.Name == "AttributeTargets"
                                && Enum.TryParse(argValue, ignoreCase: false, out AttributeTargets parsedValue)
                                && parsedValue == AttributeTargets.Class | parsedValue.ToString().Split(',').Contains("Class");
                        }));
    }
    return true;
}
当我将表示
MyAttribute
AttributeData
对象传递给该方法时,这个新的实现返回
true
(完全符合我的要求)