如何让一个方法接受两种类型的数据作为参数?

时间:2012-04-12 17:38:29

标签: c# .net arraylist hashtable arguments

我有一个方法,接受一个Hashtable(是的,我知道,它已经过时了......)作为参数:

public static LuaTable HashtableToLuatable(Hashtable t, int depth = 1)

这是正常的。

现在我也想接受一个ArrayList作为第一个参数,所以你可以让't'拥有Hashtable和ArrayList的值。目前我已经两次复制粘贴方法,如下所示:

public static LuaTable ArraylistToLuatable(ArrayList t, int depth = 1)

其余的完全一样。

我认为有一种方法可以合并它。

5 个答案:

答案 0 :(得分:10)

这两个类都实现了ICollection接口,因此如果你的“公共代码”对ICollection接口的定义起作用,你可以将它用作参数类型。

答案 1 :(得分:2)

您已经展示了一个方法重载的示例,到目前为止您所做的是在C#框架内工作。

问题是,该方法必须对传入的值做什么。必须有一些方法将它们视为“等同”。一种方法是,如果两种类型都实现相同的接口。

ArrayList implements:IList,ICollection,IEnumerable

Hashtable implements:IDictionary,ICollection,IEnumerable

如果方法体内的代码只是将第一个参数视为集合,则可以将方法签名更改为:

public static LuaTable HashtableToLuatable(ICollection t, int depth = 1)

如果您的实现不使用或要求ICollection中的所有内容,您可以改为指定

public static LuaTable HashtableToLuatable(IEnumerable t, int depth = 1)

更多的对象实现IEnumerable而不是ICollection,因此使用IEnumerable(如果可能的话)将允许更大的灵活性来传递不同类型的对象。

答案 2 :(得分:2)

这两种类型都实现了IEnumerableICollection,因此请重写您的方法签名以使用其中一种:

public static LuaTable EnumerableToLuaTable(IEnumerable t, int depth = 1)

public static LuaTable CollectionToLuaTable(ICollection t, int depth = 1)

如果IEnumerable中不需要任何内容​​,我希望ICollection选项优先于ICollection

答案 3 :(得分:1)

这两种(非常过时的)类型都实现了两个通用接口,即: IEnumerableICollection。因此,您可以基于这些接口设置通用约束。

static void ArraylistToLuatable<T>( T collection ) where T : IEnumerable
{
    foreach( var item in collection )
    {
        // do something
    }
}

当然,这仍然很糟糕,因为item将属于object类型,这对于ArrayList参数比HashTable参数更有效,在幕后,您必须以某种方式处理DictionaryEntry,这意味着您必须检查方法中的类型并适当地投射item

您确定无法使用更新的通用集合类型吗?当你从DLL中获取它们时,是否可以将它们包装在通用集合中?我想这取决于你需要多少这类东西。如果它只是一种或两种方法,那么这种方式可能很好。

答案 4 :(得分:0)

你可以试试泛型,如果这对你有用..

public static LuaTable <T> HashtableToLuatable(T t, int depth = 1) where T : ICollection

如果上述情况不符合您的情况,您也可以派生自己的数据类型。