我有一个接受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
答案 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();
}
这样,您可以添加所需的所有方法。