C# CustomAttributeData class 到属性
C# CustomAttributeData class to attribute
我有以下代码位于 Swashbuckle.Swagger.IOperationFilter
class.
List<CustomAttributeData> controllerAttributes = apiDescription
.ActionDescriptor
.ControllerDescriptor
.ControllerType
.CustomAttributes
.Where(a => a.AttributeType == typeof(SwaggerFileInFormDataAttribute))
.ToList();
我正在成功获取 collection。我想将 collection List<CustomAttributeData>
转换为自定义属性 List<SwaggerFileInFormDataAttribute>
.
的 collection
我想将 System.Reflection.CustomAttributeData
class 转换为我的自定义属性 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>
后,我将使用 class SwaggerFileInFormDataAttribute
中显示的 属性 命名为 DisplayNames
.
在您的 .Where
之后添加一个 select 并根据需要进行翻译。最简单的方法是,在您的自定义 class 中,创建一个将 SwaggerFileInFormDataAttribute
作为参数并根据需要映射到您的自定义 class 的构造函数。那么你的 Select
将是:
.Where(a => a.AttributeType == typeof(SwaggerFileInFormDataAttribute))
.Select(a => new CustomAttributeData(a))
.ToList();
第一个解决方案:
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();
说明: 如果所需属性的构造函数为空,则可以跳过变量 costuctorArgumentsReadOnlyCollection
和 contructorParams
。
在那种情况下,只有这一行就足够了:
(SwaggerFileInFormDataAttribute)Activator.CreateInstance(a.AttributeType, null);
第二种解决方案:
这是一个更简洁的解决方案。我们可以像这样完全跳过 IOperationFilter
中的 CustomAttributeData
class:
List<SwaggerFileInFormDataAttribute> controllerAttributes = apiDescription
.ActionDescriptor
.ControllerDescriptor
.GetCustomAttributes<SwaggerFileInFormDataAttribute>()
.ToList();
我有以下代码位于 Swashbuckle.Swagger.IOperationFilter
class.
List<CustomAttributeData> controllerAttributes = apiDescription
.ActionDescriptor
.ControllerDescriptor
.ControllerType
.CustomAttributes
.Where(a => a.AttributeType == typeof(SwaggerFileInFormDataAttribute))
.ToList();
我正在成功获取 collection。我想将 collection List<CustomAttributeData>
转换为自定义属性 List<SwaggerFileInFormDataAttribute>
.
我想将 System.Reflection.CustomAttributeData
class 转换为我的自定义属性 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>
后,我将使用 class SwaggerFileInFormDataAttribute
中显示的 属性 命名为 DisplayNames
.
在您的 .Where
之后添加一个 select 并根据需要进行翻译。最简单的方法是,在您的自定义 class 中,创建一个将 SwaggerFileInFormDataAttribute
作为参数并根据需要映射到您的自定义 class 的构造函数。那么你的 Select
将是:
.Where(a => a.AttributeType == typeof(SwaggerFileInFormDataAttribute))
.Select(a => new CustomAttributeData(a))
.ToList();
第一个解决方案:
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();
说明: 如果所需属性的构造函数为空,则可以跳过变量 costuctorArgumentsReadOnlyCollection
和 contructorParams
。
在那种情况下,只有这一行就足够了:
(SwaggerFileInFormDataAttribute)Activator.CreateInstance(a.AttributeType, null);
第二种解决方案:
这是一个更简洁的解决方案。我们可以像这样完全跳过 IOperationFilter
中的 CustomAttributeData
class:
List<SwaggerFileInFormDataAttribute> controllerAttributes = apiDescription
.ActionDescriptor
.ControllerDescriptor
.GetCustomAttributes<SwaggerFileInFormDataAttribute>()
.ToList();