这个问题与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[]
,{ {1}},或者我后面选择的完全定义的结构。
到目前为止,我对我出色的优雅解决方案感到非常满意。我的Codey奖与获胜一样好。然后我尝试编写一个实现。这个定义并不好:
Dictionary<string, value>
编译结果为:
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'.
约束,所以我可以强制转换sObjects,但因为转换不是隐式的,所以它对于实现类来说还不够好。
我需要亲吻我整洁的小解决方案再见,还是有办法挽救这个?这是我的第一个Salesforce项目,所以如果我需要采取不同的方式,请告诉我。
对于糟糕的电影/ MST3K buff:
图表上“必须”和“不能”在哪里见面?
答案 0 :(得分:1)
Lead 继承自sObject,但抽象类位于库中,位于实现类的不同命名空间和项目中,并且每个类都使用Salesforce WSDL。我要求编译器将SalesforceExtractor.Salesforce.Lead强制转换为SalesforceUtilities.Salesforce.sObject,这是无效的。我必须在我的实施班中更明确:
class LeadReader: SalesforceReader<SalesforceUtilities.Salesforce.Lead, object[]>
这编译,我想我应该好好去。
答案 1 :(得分:0)
听起来你需要修改Lead类来继承sObject。如果这些课程不是你的,你需要改变你的设计。
答案 2 :(得分:0)
SF Lead
对象确实继承自sObject
,因此这是generic type variance的工作,是协方差/逆变的子集。祝你的Codey接受演讲好运。