У меня есть следующий код ...Activator.CreateInstance и передавая коробочный объект в вызываемом метод
My Command Обработчик:
public class MyHandler : IHandler
{
// I Want to get rid of this method
public override void ExecuteOperation(BaseOperation operation)
{
// This is a work-around
this.ExecuteOperation(operation as SpecificOperation);
}
public override void ExecuteOperation(SpecificOperation operation)
{
// Do actual work here
}
}
Мой обработчик команд диспетчер:
private dynamic FindOperationHandler(TBaseProvisioningOperation operation)
{
... some logic here
return Activator.CreateInstance(handlerType, ... args here ...)
}
Мой потребительский код
public void PerformProvisioningOperation(BaseOperation operation)
{
// Find the correct handler for this operation
var operationHandler = this.FindOperationHandler(operation as TBaseProvisioningOperation);
// make it execute the operation
// NOTE: 'operation' is SpecificOperation type, for example
operationHandler.ExecuteOperation(operation); // <--- problem is here
}
Проблема в том, что когда я создаю экземпляр класса моего обработчика с Activator.CreateInstance
и передаю ему объект в штучной упаковке (т. как параметр «BaseOperation
»), .NET ищет метод в обработчике, который имеет параметр базового типа, вместо автоматического вызова того, который может обрабатывать объект, если он был распакован (т. е. явно лишен).
Конечно, мы имеем SpecificOperation : BaseOperation
Другими словами: я хочу, когда я исполняю operationHandler.ExecuteOperation(operation);
, .NET для вызова ExecuteOperation(SpecificOperation operation)
вместо ExecuteOperation(BaseOperation operation)
, так как параметр операции в штучной упаковке (т.е. IS SpecificOperation
, но подавленным-е изд, как BaseOperation
).
Как это достичь?
Edit:
public interface IHandler<TOperation> where TOperation : BaseOperation
{
/// <summary>
/// TODO: Get rid of this method
/// </summary>
/// <param name="operation">The operation to execute - boxed</param>
void ExecuteOperation(BaseOperation operation);
/// <summary>
/// Executes the operation
/// </summary>
/// <param name="operation">The operation to execute - unboxed</param>
void ExecuteOperation(TOperation operation);
}
Вы должны избегать возвращения 'dynamic' если полный код находится в C#. –
Каков фактический тип, возвращаемый 'FindOperationHandler'? Кроме того, что такое 'TBaseProvisioningOperation'? Существуют ли какие-либо дженерики? – haim770
@JeroenvanLangen, я предполагаю, что 'dynamic' используется здесь для достижения Double Dispatch – haim770