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

实例化无公开构造函数的Azure SDK类时报缺少0参数构造函数错误

报错原因

你遇到的报错是这类Azure SDK模型类的设计规范导致的:

  • FacetResult、BlobItem这类类属于Azure服务返回的只读结果模型,SDK设计时就没有开放公开构造函数,目的是避免开发者手动构造出不符合规范的无效实例,这类实例正常场景下只会由Azure SDK在收到服务端返回结果时内部反序列化生成。
  • System.Exception属于通用基础类,设计定位就是允许开发者按需手动构造,所以会公开无参数构造函数,两者的设计目标完全不同。

单元测试的解决方案

你可以用以下两种常用方案构造这类无公开构造函数的类的实例,解决单元测试阻塞问题:

  1. 反射构造(快速实现)
    通过反射调用类的非公开构造函数生成实例,也可以通过反射给只读属性赋值,示例代码:
using System.Reflection;
using Azure.Search.Documents.Models;

// 获取非公开构造函数
var constructor = typeof(FacetResult).GetConstructors(BindingFlags.Instance | BindingFlags.NonPublic).First();
// 传入构造参数生成实例,参数列表可以通过查看类的元数据获取
var facetResult = (FacetResult)constructor.Invoke(new object[] { 10, "testValue" });

// 如需给只读属性赋值也可以通过反射实现
var valueProp = typeof(FacetResult).GetProperty(nameof(FacetResult.Value), BindingFlags.Instance | BindingFlags.Public);
valueProp.SetValue(facetResult, "modifiedValue");
  1. Mock框架构造(单元测试最佳实践)
    用Moq、NSubstitute等单元测试常用的Mock框架生成代理对象,自定义配置需要的属性返回值,以Moq为例:
using Moq;
using Azure.Search.Documents.Models;

var mockFacetResult = new Mock<FacetResult>();
// 配置属性返回值
mockFacetResult.Setup(f => f.Count).Returns(20);
mockFacetResult.Setup(f => f.Value).Returns("testFacet");
// 获得可用的实例
FacetResult result = mockFacetResult.Object;

你也可以根据自己的技术栈选择用JSON反序列化的方式构造实例,只要JSON结构匹配类的定义,.NET的序列化器可以跳过公开构造函数的限制直接生成实例。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 18:57:02