为什么我的实现总是调用相同的派生类?

时间:2019-06-06 13:19:35

标签: c# oop dependency-injection abstract-class derived-class

我有一个接受Type作为构造函数参数的基类,以及两个从该基类继承的派生类。我还有一个该基类的接口,可以在其他地方使用。

当我将基本方法“ FormatValue”作为参数传递不同的类型时,我总是得到相同的结果(它在一个类中调用该方法,而忽略了我的类型参数)。

我在做什么错了?

public interface IFormatService
{
    string FormatValue(object value);
}
public abstract class FormatService : IFormatService
{
    protected FormatService(Type type)
    { }

    public abstract string FormatValue(object value);
}

public static class Program
{
    private static void Main(string[] args)
    {
        var serviceProvider = new ServiceCollection()
            .AddSingleton<IFormatService, CurrencyFormat>()
            .AddSingleton<IFormatService, DateTimeFormat>()
            .BuildServiceProvider();

        var formatService = serviceProvider.GetService<IFormatService>();

        Console.WriteLine(formatService.FormatValue(DateTime.Now));
        Console.WriteLine(formatService.FormatValue(200));

        Console.ReadLine();
    }
}

public class CurrencyFormat : FormatService
{
    public CurrencyFormat() : base(typeof(decimal))
    {
    }

    public override string FormatValue(object value) => "CurrencyFormatter";
}

public class DateTimeFormat : FormatService
{
    public DateTimeFormat() : base(typeof(DateTime))
    {
    }

    public override string FormatValue(object value) => "DateTimeFormatter";
}

当前结果:

DateTimeFormatter
DateTimeFormatter

预期结果:

DateTimeFormatter
CurrencyFormatter

2 个答案:

答案 0 :(得分:1)

下面指出的代码将覆盖您之前的CurrencyFormat注册,因此它始终解析为DateTimeFormat。

var serviceProvider = new ServiceCollection()
    .AddSingleton<IFormatService, CurrencyFormat>()
    .AddSingleton<IFormatService, DateTimeFormat>() <---------
    .BuildServiceProvider();

答案 1 :(得分:0)

如果要根据参数类型调用不同的方法,则有很多方法可以实现。

一种方法是使用dynamic在运行时选择最佳重载:

public interface IFormatService
{
    string FormatValue(object value);
}

public class FormatService : IFormatService
{
    public string FormatValue(object value)
    {
        dynamic valueAsDynamic = value;

        return FormatValueDynamic(valueAsDynamic);
    }

    string FormatValueDynamic(dynamic value) => FormatValuePrivate(value);

    string FormatValuePrivate(DateTime value) => "DateTimeFormatter";

    string FormatValuePrivate(decimal value) => "CurrencyFormatter";

    string FormatValuePrivate(object value) => throw new NotSupportedException();
}

这样,您可以添加所需的所有方法。