这个问题涉及到C#和Salesforce,可能有各种解决方案。欢迎提出建议!
我正在编写一个通用类来读取Salesforce数据。签名如下:
public abstract class SalesforceReader<SalesforceObjectType, RecordType>
where SalesforceObjectType: sObject
这让我以后可以使用这段代码:
List<RecordType> records = new List<RecordType>();
QueryResult queryResult = service.query(query);
foreach (sObject rawRecord in queryResult.records)
records.Add(ConvertRecord((SalesforceObjectType)rawRecord));
...
public abstract RecordType ConvertRecord(SalesforceObjectType record);
计划是编写这个类的实现,它知道如何将例如Salesforce的
Lead
对象解析为RecordType
,可以是基本的object[]
,Dictionary<string, value>
或者稍后我选择的完全定义的结构体。
到目前为止,我对自己的精妙优雅的解决方案感到非常满意。我的Codey奖已经稳操胜券了。然而,当我尝试编写实现时,这个定义就不太好用了:
class LeadReader: SalesforceReader<Lead, object[]>
编译器的结果是:
The type 'SalesforceExtractor.Salesforce.Lead' cannot be used as type
parameter 'SalesforceObjectType' in the generic type or method
'SalesforceUtilities.SalesforceReader<SalesforceObjectType,RecordType>'.
There is no implicit reference conversion from
'SalesforceExtractor.Salesforce.Lead' to
'SalesforceUtilities.Salesforce.sObject'.
很遗憾。我必须在抽象类中有
where SalesforceObjectType: sObject
约束条件,以便可以将sObjects转换为指定类型,但由于转换不是隐式的,所以对于实现类来说并不足够。是否需要放弃我的好方法,还是有挽救的办法?这是我第一个Salesforce项目,如果我需要采用不同的方法,请让我知道。对于那些热爱烂电影/MST3K的人来说: "must"和"cannot"何时相遇?