C#/Salesforce: 必须限制泛型,不能约束泛型。

4

这个问题涉及到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"何时相遇?
3个回答

1

啊哈,我只需要离开半个小时再回来看它。在使用计算机工作了20年后,你会认为我已经学会了问题通常是透过不同的角度来看待。

Lead确实继承自sObject,但抽象类位于库中,与实现类位于不同的命名空间和项目中,并且它们都在使用Salesforce WSDL。我要求编译器将SalesforceExtractor.Salesforce.Lead转换为SalesforceUtilities.Salesforce.sObject,这是无效的。我只需要在我的实现类中更加明确:

class LeadReader: SalesforceReader<SalesforceUtilities.Salesforce.Lead, object[]>

这个编译通过了,我觉得应该可以继续进行了。


0

看起来你需要修改Lead类,让它继承自sObject。如果这些类不是你自己的,那么你需要改变你的设计。


0

SF的Lead对象确实继承自sObject,因此这是泛型类型变异的工作,它是协变性/逆变性的子集。祝你在Codey颁奖典礼上好运。


你说得很对,我需要调整我的命名空间以使编译器理解这一点。关于协变和逆变,我阅读了你提供的文章并尝试了几种变体,但没有成功。 - user565869

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接