我有一个接口(interface) ICommandHandler
我无法做的是将 SomeWorkProcessCommandHandler 类传递给它期望在其构造函数中使用 ICommandHandler 的另一个类
在下面的代码中,Manager 类需要在其构造函数中使用 ICommandHandler
如何在构造函数中传递 someWorkProcessCommandHandler 对象?
请不要告诉我从构造函数中删除它并在 Execute 方法中找出处理程序。我不想那样做。我在这里唯一想弄清楚的是,如何传递具有层次结构接口(interface)的对象
public interface ICommand
{
}
public interface ICommandHandler<TCommand> where TCommand : ICommand
{
void Handle(TCommand command);
}
public class SomeWorkProcessCommand : ICommand
{
}
public class SomeWorkProcessCommandHandler : ICommandHandler<SomeWorkProcessCommand>
{
public void Handle(SomeWorkProcessCommand command)
{
Console.WriteLine("Some work Process Command Handler ");
}
}
public class Manager
{
private readonly ICommandHandler<ICommand> handler;
public Manager(ICommandHandler<ICommand> handler)
{
this.handler = handler;
}
public void Execute(ICommand command)
{
handler.Handle(command);
}
}
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Hello World!");
var someWorkProcessCommandHandler = new SomeWorkProcessCommandHandler();
someWorkProcessCommandHandler.Handle(new SomeWorkProcessCommand());// This line works fine if the below code is not present
//var manager = new Manager(someWorkProcessCommandHandler); //Compile time error
var manager = new Manager((ICommandHandler<ICommand>)someWorkProcessCommandHandler); //Runtime error after casting
manager.Execute(new SomeWorkProcessCommand());
Console.ReadKey();
}
}
最佳答案
问题出在您的 Manager 类设计中。你也应该在那里使用泛型。这是更新后的代码,它可以工作:
public interface ICommand
{
}
public interface ICommandHandler<TCommand> where TCommand : ICommand
{
void Handle(TCommand command);
}
public class SomeWorkProcessCommand : ICommand
{
}
public class SomeWorkProcessCommandHandler : ICommandHandler<SomeWorkProcessCommand>
{
public void Handle(SomeWorkProcessCommand command)
{
Console.WriteLine("Some work Process Command Handler ");
}
}
public class Manager<TCommandHandler, TCommand>
where TCommandHandler : ICommandHandler<TCommand>
where TCommand : ICommand
{
private readonly TCommandHandler handler;
public Manager(TCommandHandler handler)
{
this.handler = handler;
}
public void Execute(TCommand command)
{
handler.Handle(command);
}
}
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Hello World!");
var someWorkProcessCommandHandler = new SomeWorkProcessCommandHandler();
someWorkProcessCommandHandler.Handle(new SomeWorkProcessCommand());// This line works fine if the below code is not present
var manager = new Manager<SomeWorkProcessCommandHandler, SomeWorkProcessCommand>(someWorkProcessCommandHandler); //Works now
manager.Execute(new SomeWorkProcessCommand());
Console.ReadKey();
}
}
希望它能解决您的问题。
关于c# - C#中如何根据层级接口(interface)初始化对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54545903/