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

如何将C#中的此异步方法转换为泛型方法?对象属性问题受阻

解决C#泛型方法无法访问特定属性的问题

要让泛型方法能访问done、nextRecordsUrl、records这些属性,核心是给泛型类型T添加接口约束,明确要求T必须实现包含这些属性的接口。具体步骤如下:

1. 定义通用接口

创建一个接口,包含分页响应所需的所有属性,确保接口的属性名和你的实体类属性完全一致(比如实体类用小写命名就保持小写):

// 定义Salesforce分页响应的通用泛型接口
public interface ISalesforcePaginatedResponse<TRecord>
{
    bool done { get; set; }
    string nextRecordsUrl { get; set; }
    List<TRecord> records { get; set; }
}

如果不需要明确记录类型,也可以简化为非泛型接口:

public interface ISalesforcePaginatedResponse
{
    bool done { get; set; }
    string nextRecordsUrl { get; set; }
    ICollection records { get; set; }
}

2. 修改泛型方法添加约束

给泛型T添加接口约束,让编译器知道T一定包含这些属性(如果CallSalesforceApi不需要实例化T,可以去掉new()约束):

泛型接口版本

private async Task<T> GetSalesforceMachineData<T, TRecord>() 
    where T : ISalesforcePaginatedResponse<TRecord>, new()
{
    T machineData = await CallSalesforceApi<T>();
    while (!machineData.done)
    {
        var encodedUrl = HttpUtility.UrlEncode(machineData.nextRecordsUrl);
        T nextData = await GetNextData<T>(encodedUrl);
        machineData.done = nextData.done;
        machineData.nextRecordsUrl = nextData.nextRecordsUrl;
        machineData.records.AddRange(nextData.records);
    }
    return machineData;
}

非泛型接口版本

private async Task<T> GetSalesforceMachineData<T>() 
    where T : ISalesforcePaginatedResponse, new()
{
    T machineData = await CallSalesforceApi<T>();
    while (!machineData.done)
    {
        var encodedUrl = HttpUtility.UrlEncode(machineData.nextRecordsUrl);
        T nextData = await GetNextData<T>(encodedUrl);
        machineData.done = nextData.done;
        machineData.nextRecordsUrl = nextData.nextRecordsUrl;
        // 非泛型接口需强制转换为具体集合类型
        ((List<object>)machineData.records).AddRange((List<object>)nextData.records);
    }
    return machineData;
}

3. 让实体类实现接口

确保你的Salesforce返回实体类实现上述接口,示例如下:

// 对应你的实际数据模型的响应类
public class MachineDataResponse : ISalesforcePaginatedResponse<MachineRecord>
{
    public bool done { get; set; }
    public string nextRecordsUrl { get; set; }
    public List<MachineRecord> records { get; set; }
}

// 单条记录的实体类
public class MachineRecord
{
    public string Id { get; set; }
    public string MachineName { get; set; }
    // 其他业务属性...
}

4. 调用泛型方法

调用时指定具体的类型参数:

// 泛型接口版本调用
var machineData = await GetSalesforceMachineData<MachineDataResponse, MachineRecord>();

// 非泛型接口版本调用
var machineData = await GetSalesforceMachineData<MachineDataResponse>();

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 04:10:24