我有一个方法,接受一个Hashtable(是的,我知道,它已经过时了......)作为参数:
public static LuaTable HashtableToLuatable(Hashtable t, int depth = 1)
这是正常的。
现在我也想接受一个ArrayList作为第一个参数,所以你可以让't'拥有Hashtable和ArrayList的值。目前我已经两次复制粘贴方法,如下所示:
public static LuaTable ArraylistToLuatable(ArrayList t, int depth = 1)
其余的完全一样。
我认为有一种方法可以合并它。
答案 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)
这两种类型都实现了IEnumerable
和ICollection
,因此请重写您的方法签名以使用其中一种:
public static LuaTable EnumerableToLuaTable(IEnumerable t, int depth = 1)
或
public static LuaTable CollectionToLuaTable(ICollection t, int depth = 1)
如果IEnumerable
中不需要任何内容,我希望ICollection
选项优先于ICollection
。
答案 3 :(得分:1)
这两种(非常过时的)类型都实现了两个通用接口,即: IEnumerable
和ICollection
。因此,您可以基于这些接口设置通用约束。
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
如果上述情况不符合您的情况,您也可以派生自己的数据类型。