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

标签 c# .net

我有一个接口(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/

相关文章:

c# - 将非模态形式重新赋予现有应用程序

c# - 将具有多个引用的实体映射到同一类型

c# - .NET WPF Process.Start() 不适用于 Vista 和 Windows 7

c# - 如何实现自定义 Windows 窗体设计器?

c# - 运行 NancyFx 时单声道中未处理的异常

c# - 返回从存储过程插入的记录数的可靠方法是什么

c# - VBA 找不到 C# dll 入口点

.net - 相机外部计算错误

c# - 您可以将数据绑定(bind)到包含 Silverlight 参数的属性吗?

C#:如何更改 MVVM 中的按钮图标?