이 질문은 C#과 Salesforce와 동일하지만 아마도 양쪽에서 가능한 솔루션이있을 수 있습니다. 제안을 환영합니다!C#/Salesforce : 일반을 제한해야 함, 일반을 제한 할 수 없음
Salesforce 데이터를 읽는 일반 클래스를 작성하고 있습니다. 서명은 다음과 같습니다
계획은 예를 들어, 구문 분석하는 방법을 알고,이 클래스의 구현을 작성하는 것입니다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);
, 세일즈 포스 Lead
:
public abstract class SalesforceReader<SalesforceObjectType, RecordType>
where SalesforceObjectType: sObject
이 날 이후에이 코드를 사용할 수 있습니다 객체를 기본 object[]
, Dictionary<string, value>
또는 나중에 선택할 때 완전히 정의 된 구조체 일 수있는 RecordType
으로 변환 할 수 있습니다.
지금까지 필자는 내 훌륭하게 우아한 솔루션에 만족했다. 내 코미디상은 원만큼 좋은 상입니다. 그런 다음 구현을 작성하려고합니다.
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 애호가 거기 나쁜 영화에 대한
?
당신은 꽤 정확합니다. 컴파일러가 이것을 이해할 수 있도록 네임 스페이스를 조정해야했습니다. 공분산 (covariance)과 반항성 (contravariance)에 관해서, 필자는 링크 된 기사를 읽었으며, 두 가지 변형을 시도했지만, 행운은 없었다. –