如何将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
相关产品推荐
相关产品推荐

