C#/ Salesforce:必须约束通用,不能约束通用

时间:2011-02-03 19:01:50

标签: c# generics salesforce

这个问题与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:

  

图表上“必须”和“不能”在哪里见面?

3 个答案:

答案 0 :(得分:1)

啊哈,我只需要走了半个小时再看一遍。在使用计算机20年后,您认为我已经了解到这个问题通常是一个透视问题。

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接受演讲好运。