меня есть интерфейсИспользуя общий C# интерфейс как класс собственности
public interface ICallback<T>
{
void OnSuccess (T data);
void OnFailure (Exception exception);
}
и класс
public class ToDoTask
{
private int someInt;
public string StringProperty {get; set;}
public ICallback Callback {get; private set;}
}
Это не компилируется, потому что он хочет, чтобы я специализировать Callback
собственности. Я не хочу специализировать свойство, потому что я не знаю тип. Тип определяется во время выполнения через отражение.
Вот небольшое объяснение того, что происходит:
- Класс прокси генерируется (с помощью
CreateInterfaceProxyWithoutTarget<C>
из Castle DynamicProxy) во время выполнения для реализации данного интерфейса (Давайте назовем этоIModel
) - Вызова (помните, что нет цели, поэтому здесь нет кода, который выполняется здесь, кроме того, что делает мой перехватчик)
- Вызов метода перехватывается основным классом, который решает, что нужно делать на основеатрибуты метода и его параметры (как определено в
IModel
) - На данный момент, если последний параметр перехваченного метода является
ICallback<T>
, он получает назначение наCallback
собственности, в противном случае этоnull
. - Если обратный вызов не null, результат операции разобран и вызывается соответствующий метод обратного вызова.
Это то, что класс перехватчик выглядит следующим образом:
public class Intercepteur : IInterceptor{
public void Intercept(IInvocation invocation) {
ToDoTask task = Study(invocation);
/*
nothing past this point is actually written,
so there may be typos or compile errors below
*/
try
{
var result = Perform(task);
if (null != task.Callback)
task.Callback.OnSuccess (MagicalTransformation (result, typeof (T)));
} catch (Exception e)
{
if (null != task.Callback)
task.Callback.OnFailure (e);
}
}
}
Безопасно объявить функцию обратного вызова в качестве ICallback<object>
и брось & возвращение во время выполнения?
Если какой-либо из вышеперечисленных звуков глуп, потому что у меня нет большого опыта с отражением на C#, и я погружаюсь глубоко в C# после 4 лет не касаясь его. Будьте любезны!
что, если 'Callback' свойство не * автоматически генерировать * и' Set' это с 'ServisFactory'? –