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
(完全符合我的要求)