You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.NET 7 API消费者能否指定返回对象的特定属性?

.NET API 动态选择返回属性方案

针对你提出的问题,.NET的API框架本身没有直接内置这种通过URL参数动态选择返回属性的开箱即用机制,但可以通过原生扩展或现成NuGet包实现批量处理,无需逐个方法编码:

原生实现方案(ASP.NET Core)

可以通过自定义ActionFilter + 动态JSON序列化来全局处理这类需求:

  1. 编写一个ActionFilter,解析请求中的prop1、prop2等参数,提取需要返回的属性列表;
  2. 自定义JSON转换器,只序列化指定的属性;
  3. 将Filter注册到全局或指定控制器,自动生效。

示例代码:

// 自定义ActionFilter
public class SelectPropertiesFilter : ActionFilterAttribute
{
    public override void OnResultExecuting(ResultExecutingContext context)
    {
        if (context.Result is ObjectResult objectResult)
        {
            // 提取所有prop开头的参数值作为要返回的属性
            var targetProps = context.HttpContext.Request.Query
                .Where(q => q.Key.StartsWith("prop"))
                .Select(q => q.Value.ToString().Trim().ToLower())
                .ToList();

            if (targetProps.Any())
            {
                var jsonOptions = new JsonSerializerOptions
                {
                    Converters = { new RestrictPropertiesConverter(targetProps) }
                };
                // 替换或添加自定义JSON格式化器
                objectResult.Formatters.Clear();
                objectResult.Formatters.Add(new SystemTextJsonOutputFormatter(jsonOptions));
            }
        }
        base.OnResultExecuting(context);
    }
}

// 自定义JSON转换器
public class RestrictPropertiesConverter : JsonConverter<object>
{
    private readonly List<string> _allowedProps;

    public RestrictPropertiesConverter(List<string> allowedProps)
    {
        _allowedProps = allowedProps;
    }

    public override object Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
        => throw new NotImplementedException("此转换器仅用于序列化输出");

    public override void Write(Utf8JsonWriter writer, object value, JsonSerializerOptions options)
    {
        writer.WriteStartObject();
        var type = value.GetType();
        foreach (var prop in type.GetProperties(BindingFlags.Public | BindingFlags.Instance))
        {
            if (_allowedProps.Contains(prop.Name.ToLower()))
            {
                writer.WritePropertyName(prop.Name);
                JsonSerializer.Serialize(writer, prop.GetValue(value), prop.PropertyType, options);
            }
        }
        writer.WriteEndObject();
    }
}

注册Filter后,所有带prop*参数的请求都会自动返回指定属性,无需在每个Action里单独处理。

现成NuGet包方案

如果不想自己实现,这些成熟包可以直接满足需求:

  • OData:微软官方提供的扩展,支持$select标准查询参数(如GET /api/vehicles/1?$select=Color,Wheels),除了属性选择还支持过滤、排序、分页等完整的查询功能。只需要在ASP.NET Core中配置OData服务,控制器继承ODataController即可。
  • FastEndpoints:轻量级API框架,内置了动态属性选择功能,通过简单配置就能支持请求参数指定返回属性,同时性能优异,适合追求轻量化的场景。
  • AutoMapper:结合ActionFilter使用,可根据请求参数动态创建映射规则,将原对象映射为仅包含指定属性的DTO,实现批量处理。

内容的提问来源于stack exchange,提问作者Yohancef Chin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 17:20:56