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

本文关键字:数据 参数 类型 两种 方法 | 更新日期: 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 接口的定义,则可以将其用于参数类型。

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

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(如果可能)将允许更大的灵活性来传递不同类型的对象。

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

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

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