如何让方法接受两种类型的数据作为参数
本文关键字:数据 参数 类型 两种 方法 | 更新日期: 2023-09-27 18:30:59
我有一个方法,接受一个哈希表(是的,我知道,它已经过时了..)作为参数:
public static LuaTable HashtableToLuatable(Hashtable t, int depth = 1)
这工作正常。
现在我也想接受 ArrayList 作为第一个参数,所以你可以让 't' 同时具有 Hashtable 和 ArrayList 的值。目前我已经复制粘贴了该方法两次,如下所示:
public static LuaTable ArraylistToLuatable(ArrayList t, int depth = 1)
其余的完全一样。
我认为有一种方法可以合并它。
这两个类都实现了 ICollection 接口,因此如果您的"通用代码"将违背 ICollection 接口的定义,则可以将其用于参数类型。
这两种类型都实现了IEnumerable
和ICollection
,因此重写方法签名以改用其中之一:
public static LuaTable EnumerableToLuaTable(IEnumerable t, int depth = 1)
或
public static LuaTable CollectionToLuaTable(ICollection t, int depth = 1)
我更喜欢IEnumerable
选项而不是ICollection
,如果你不需要任何东西ICollection
.
您已经展示了一个方法重载的示例,到目前为止,您正在执行的操作在 C# 框架内工作。
问题是,该方法必须对传入的值执行什么操作。 必须有一些方法将它们视为"等同"。 一种方法是两种类型实现相同的接口。
ArrayList 实现:IList、ICollection、IEnumerable
Hashtable 实现: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(如果可能)将允许更大的灵活性来传递不同类型的对象。
这两种(非常过时的)类型都实现了两个通用接口,即; IEnumerable
和ICollection
. 因此,您可以基于这些接口设置通用约束。
static void ArraylistToLuatable<T>( T collection ) where T : IEnumerable
{
foreach( var item in collection )
{
// do something
}
}
当然,这仍然很糟糕,因为item
将是 object
型,这将比您的HashTable
参数更适合您的ArrayList
参数,因为在幕后,您必须以某种方式处理DictionaryEntry
,这意味着您必须在方法中检查其类型并适当地投item
。
是否确定不能使用更新的泛型集合类型? 当您从 DLL 获取它们时,是否可以将它们包装在泛型集合中? 我想这取决于你这边需要多少这种东西。 如果只是一两种方法,这样可能没问题。
你可以尝试泛型,如果这对你有用的话。
public static LuaTable <T> HashtableToLuatable(T t, int depth = 1) where T : ICollection
如果上述情况不适合您的情况,您也可以派生自己的数据类型。