gpt4 book ai didi

C# CustomAttributeData 类到属性

转载 作者:行者123 更新时间:2023-12-03 23:44:43 26 4
gpt4 key购买 nike

我有以下代码位于 Swashbuckle.Swagger.IOperationFilter类(class)。

List<CustomAttributeData> controllerAttributes = apiDescription
.ActionDescriptor
.ControllerDescriptor
.ControllerType
.CustomAttributes
.Where(a => a.AttributeType == typeof(SwaggerFileInFormDataAttribute))
.ToList();
我正在成功获取集合。我要转换收藏 List<CustomAttributeData>进入我的自定义属性集合 List<SwaggerFileInFormDataAttribute> .
enter image description here
我想转换 System.Reflection.CustomAttributeData类到我的自定义属性 SwaggerFileInFormDataAttribute .

编辑1:
这是我的 SwaggerFileInFormDataAttribute属性看起来像。
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = false, Inherited = false)]
public class SwaggerFileInFormDataAttribute : Attribute
{
private ICollection<string> displayNames;

public SwaggerFileInFormDataAttribute()
{
this.DisplayNames = new List<string> { "File" };
}

public SwaggerFileInFormDataAttribute(params string[] displayNames)
{
this.DisplayNames = displayNames;
}

public ICollection<string> DisplayNames
{
get
{
if (this.displayNames == null)
return new List<string> { "File" };
else
return this.displayNames;
}
set => displayNames = value;
}
}
成功转换后 List<CustomAttributeData>List<SwaggerFileInFormDataAttribute>我将使用类 SwaggerFileInFormDataAttribute 中显示的属性命名 DisplayNames .

最佳答案

第一个解决方案:

List<SwaggerFileInFormDataAttribute> customControllerAttributes = apiDescription
.ActionDescriptor
.ControllerDescriptor
.ControllerType
.CustomAttributes
.Where(a => a.AttributeType == typeof(SwaggerFileInFormDataAttribute))
.Select(a =>
{
ReadOnlyCollection<CustomAttributeTypedArgument> costuctorArgumentsReadOnlyCollection = (ReadOnlyCollection<CustomAttributeTypedArgument>)a.ConstructorArguments.Select(x => x.Value).FirstOrDefault();

string[] contructorParams = costuctorArgumentsReadOnlyCollection?.ToArray().Select(x => x.Value.ToString()).ToArray();
SwaggerFileInFormDataAttribute myCustomAttr = (SwaggerFileInFormDataAttribute)Activator.CreateInstance(a.AttributeType, contructorParams);
return myCustomAttr;
})
.ToList();
解释:两个变量 costuctorArgumentsReadOnlyCollectioncontructorParams如果所需属性的构造函数为空,则可以跳过。
在这种情况下,只有这一行就足够了: (SwaggerFileInFormDataAttribute)Activator.CreateInstance(a.AttributeType, null);第二种解决方案:
这是一个更清洁的解决方案。我们可以完全跳过 CustomAttributeData IOperationFilter 中的类像那样:
List<SwaggerFileInFormDataAttribute> controllerAttributes = apiDescription
.ActionDescriptor
.ControllerDescriptor
.GetCustomAttributes<SwaggerFileInFormDataAttribute>()
.ToList();

关于C# CustomAttributeData 类到属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63583389/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com