2016-10-11 2 views
0

Делегат:Интерфейс Делегат Кастинг

public delegate Result SalesforceAPIOnFailureEventHandler<T1, T2>(T1 sObject, T2 rawObject, string reason) where T1 : SalesforceApex.sObject; 

Интерфейс:

public interface iSalesforceAPIHelperConfiguration<T1, T2> where T1 : SalesforceApex.sObject 
    { 
     SalesforceAPIOnFailureEventHandler<T1, T2> OnFailure { get; set; } 
    } 

Класс:

public class SalesforceAPIHelperConfiguration<T1, T2> : iSalesforceAPIHelperConfiguration<T1, T2> where T1 : SalesforceApex.sObject 
    { 
     public SalesforceAPIOnFailureEventHandler<T1, T2> OnFailure { get; set; } 
    } 

Функция:

Type typeArg = typeof(SalesforceAPIHelperConfiguration<,>); 
    Type[] typeArgs = { SalesforceApex.Account, typeof(object) }; 
    Type typeClass = typeArg.MakeGenericType(typeArgs); 
    iSalesforceAPIHelperConfiguration<SalesforceApex.sObject, object> salesforceAPIHelperConfiguration = (iSalesforceAPIHelperConfiguration<SalesforceApex.sObject, object>)Activator.CreateInstance(typeClass);      

Так что в принципе, мне нужно создать класс типа SalesforceAPIHelperConfiguration, как показано выше. Я могу создать класс, но я не могу его передать в свой интерфейс. Как я могу это сделать?

Я намерен создать классы типа SalesforceAPIHelperConfiguration и предоставить общие параметры во время выполнения. Затем мне нужно будет инициализировать обработчик событий OnFailure, который будет отображаться через интерфейс.

+0

Какое сообщение об ошибке/исключении? –

+0

Невозможно наложить объект типа «SalesforceAPIHelperConfiguration'2 [SalesforceApex.Account, System.Object]», чтобы напечатать «SalesforceAPIHelperConfiguration'2 [SalesforceApex.sObject, System.Object]». – JEPAAB

+0

OK. Обратите внимание, что часть отражения здесь не уместна, она только отвлекает. –

ответ

2

Ваш интерфейс инвариантного по отношению к T1 и T2, так как оба значению выхода, использующее этим типам и принимает значения в качестве входных данных с использованием этих типов. Поскольку он является инвариантным, вы не можете обрабатывать iSalesforceAPIHelperConfiguration<someDerivedSFObject, someType>, как если бы он был iSalesforceAPIHelperConfiguration<SalesforceApex.sObject, object>. Если среда выполнения позволит вам это сделать, вы можете передать объект (для любого типа), который фактически не соответствовал фактическим общим аргументам реального конкретного типа.

+0

Есть ли возможное обходное решение? – JEPAAB

+2

@JEPAAB № Что вы просите, в принципе бессмысленно. Вы либо должны сделать сам интерфейс логически ковариантным, удалив все операции, которые позволяют ему принимать значения, используя общие аргументы, или вы не можете разумно относиться к интерфейсу ковариантно. – Servy

+0

Итак, в моем случае вы хотите изменить обработчик события OnFailure, чтобы не включать общие параметры? Если да, как я могу заверить, что T1 имеет определенный тип? – JEPAAB