gpt4 book ai didi

c# - C#中如何根据层级接口(interface)初始化对象

转载 作者:太空狗 更新时间:2023-10-30 01:12:55 25 4
gpt4 key购买 nike

我有一个接口(interface) ICommandHandler ,其中 TCommand 是 ICommand 类型(另一个接口(interface))。SomeWorkProcessCommandHandler 类实现 ICommandHandler。

我无法做的是将 SomeWorkProcessCommandHandler 类传递给它期望在其构造函数中使用 ICommandHandler 的另一个类

在下面的代码中,Manager 类需要在其构造函数中使用 ICommandHandler 。当我传递 someWorkProcessCommandHandler 对象时出现编译时错误。如果我施放它,我会得到运行时异常。

如何在构造函数中传递 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com