C # / Salesforce: необходимо ограничивать родовое, не может ограничивать родовое - PullRequest
4 голосов
/ 03 февраля 2011

Этот вопрос равен частям 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> или полностью определенной структурой, как я выберу позже.

Пока что яЯ доволен моим блестяще элегантным решением.Моя награда Коди так же хороша, как и выиграна.Затем я пытаюсь написать реализацию.Это определение не годится:

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'.

Bummer.У меня должно быть ограничение where SalesforceObjectType: sObject в абстрактном классе, чтобы я мог приводить sObjects, но поскольку преобразование не является неявным, его недостаточно для реализующего класса.

Нужно ли мне целовать мой аккуратный маленькийрешение до свидания, или есть способ спасти это?Это мой первый проект Salesforce, поэтому, если мне нужно подходить к чему-то другому, пожалуйста, дайте мне знать.

Для любителей плохого фильма / MST3K:

Где делать"а" нельзя "встретить на графике?

Ответы [ 3 ]

1 голос
/ 03 февраля 2011

Ага, мне просто нужно было уйти на полчаса и снова посмотреть на это. После 20 лет работы с компьютерами вы могли бы подумать, что я понял, что проблема обычно в перспективе.

Lead наследует от sObject, но абстрактный класс находился в библиотеке, в другом пространстве имен и проекте от реализующего класса, и каждый из них использовал Salesforce WSDL. Я просил компилятор привести SalesforceExtractor.Salesforce.Lead к SalesforceUtilities.Salesforce.sObject, что недопустимо. Я просто должен был быть более явным в своем классе реализации:

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

Это компилируется, и я думаю, что мне нужно идти.

0 голосов
/ 03 февраля 2011

Объект SF Lead наследуется от sObject, поэтому это задание для дисперсии универсального типа , подмножества ковариации / контравариантности.Удачи вам в вашем выступлении с Коди.

0 голосов
/ 03 февраля 2011

Похоже, вам нужно изменить класс Lead для наследования от sObject. Если эти классы не ваши, вам нужно изменить свой дизайн.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...