如何编写适配器类来模拟基本类型上的接口



我有一个接受接口的方法。我为每个基本类型(和字符串)编写了一个自定义函数。下面是它的样子:

public interface IFoo
{
    void DoSomething();
}
static void IntDoSomething(int value)
{
    // do something with an int, as if it implemented IFoo
}
static void FloatDoSomething(float value)
{
    // do something with a float, as if it implemented IFoo
}
// ... I have an XDoSomething() for all the other primitives and string
public void Execute(IFoo value)
{
    value.DoSomething();
}
public void Execute(int value)
{
    IntDoSomething();
}
public void Execute(float value)
{
    FloatDoSomething();
}
// ... I have an Execute() for all the other primitives and string

虽然很繁琐,但是为每个基本类型都使用Execute()是可行的。问题是当我必须添加这样的东西时:

public void Execute(List<IFoo> values)
{
    foreach (IFoo foo in values)
    {
        values.DoSomething();
    }
}
public void Execute(Dictionary<IFoo, IFoo> values)
{
    foreach (var pair in values)
    {
        pair.Key.DoSomething();
        pair.Value.DoSomething();
    }
}

我必须写一个Execute()函数,每次我有一个新的集合,我想处理?对于dictionary,我必须为每个原语的每个组合显式定义版本!

我觉得有一个解决方案,包括编写一个适配器类,将原语包装为ifoo,但我似乎不能在不破坏Execute()的方法签名的情况下这样做。我不希望用户必须先创建适配器,我希望它隐式地发生。有什么办法吗?

谢谢!

我可能误解了,但是你能这样做吗?希望这不是你想要避免的……您必须为每个原语编写适配器,但至少您能够执行

集合。
public inteface IFoo
{
    void DoSomething();
}
public IntFoo : IFoo
{
    private int _value;
    public IntFoo(int value)
    {
        _value = value;
    }
    void DoSomething()
    {
        IntDoSomething(_value);
    }
}

我想到了两个选项;

一种是让DoSomething接受一个对象,这样任何值都可以工作,并且可以在形参上使用"is"操作符来确定类型。这显然不是很类型安全。

此外,正如您提到的,您可以使DoSomething成为泛型函数。然后,在实现中可以使用:

public void Execute<T>( T value) 
{
    if( value is int )
    {
        IntDoSomething();
    }
    else if( value is float)
    {
        FloatDoSomething();
    }
}

等。

同样不是很类型安全,所以您可能希望在方法的顶部验证输入

最新更新