我有一个接受接口的方法。我为每个基本类型(和字符串)编写了一个自定义函数。下面是它的样子:
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();
}
}
等。
同样不是很类型安全,所以您可能希望在方法的顶部验证输入