2011-02-03 2 views
4

이 질문은 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 애호가 거기 나쁜 영화에 대한

?

답변

1

아하, 나는 단지 30 분을 떠나서 다시보아야했다. 20 년 동안 컴퓨터로 작업 한 후에는 문제가 대개 하나의 관점이라는 것을 알았을 것입니다.

리드 은 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

당신은 꽤 정확합니다. 컴파일러가 이것을 이해할 수 있도록 네임 스페이스를 조정해야했습니다. 공분산 (covariance)과 반항성 (contravariance)에 관해서, 필자는 링크 된 기사를 읽었으며, 두 가지 변형을 시도했지만, 행운은 없었다. –