2011-02-03 9 views
4

この質問は、C#と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オブジェクトをに変換します。これは、基本的なobject[]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'. 

残念この定義は良くありません。私は抽象クラスにwhere SalesforceObjectType: sObject制約を持たなければならないので、私はsObjectsをキャストすることができますが、変換は暗黙的ではないので、実装クラスにとって十分ではありません。

私はきちんとした小さな解決策にキスをする必要がありますか、これを救済する方法はありますか?これは私の最初のSalesforceプロジェクトです。もし私が別のものにアプローチする必要があれば、私に教えてください。グラフに会い、「できません」「しなければならない」ん

:そこに悪い映画/ MST3Kマニアのために

答えて

1

ああ、私はちょうど30分歩き、それをもう一度見る必要がありました。 20年間コンピューターを使って作業していたのですが、私はその問題が通常は視点の1つであることを学んだと思います。

リードはsObjectから継承しますが、抽象クラスはライブラリ内にあり、実装クラスとは異なる名前空間とプロジェクトであり、それぞれSalesforce WSDLを使用していました。 SalesforceExtractor.Salesforce.LeadをSalesforceUtilities.Salesforce.sObjectにキャストするようコンパイラーに依頼していましたが、これは無効です。私は実装クラスでもっと明示的に述べなければなりませんでした:

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

これはコンパイルされ、私は良いと思います。

0

sObjectから継承するようにLeadクラスを変更する必要があるようです。これらのクラスがあなたのものでない場合は、デザインを変更する必要があります。

0

SF LeadオブジェクトはsObjectから継承します。したがって、これは、共分散/反分散のサブセットであるgeneric type varianceの仕事です。あなたのコディ受諾演説で幸運を祈る。

+0

あなたはかなり正しいです、私はコンパイラがこれを理解できるように私の名前空間を調整する必要がありました。共分散とコントラバナンスに関しては、あなたがリンクしている記事を読んでいます。 –

関連する問題