1

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

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

这可以正常工作。

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

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

其余的完全一样。

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

4

5 回答 5

10

这两个类都实现了 ICollection 接口,因此如果您的“通用代码”将与 ICollection 接口的定义相违背,您可以将其用于您的参数类型。

于 2012-04-12T17:41:20.987 回答
2

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

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

ArrayList 实现:IList、ICollection、IEnumerable

哈希表实现:IDictionary、ICollection、IEnumerable

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

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

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

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

与 ICollection 相比,更多的对象实现了 IEnumerable,因此使用 IEnumerable(如果可能)将允许在以后传递不同类型的对象时具有更大的灵活性。

于 2012-04-12T17:42:16.130 回答
2

两种类型都实现IEnumerableand ICollection,因此重写您的方法签名以使用其中之一:

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

或者

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

如果您IEnumerable不需要.ICollectionICollection

于 2012-04-12T17:43:49.117 回答
1

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

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

当然,这仍然很糟糕,因为item它将是 type object,这对你的ArrayList论点比你的HashTable论点更有效,因为在幕后,你必须以某种方式处理 a DictionaryEntry,这意味着你必须在方法中检查它的类型并适当地投你的item

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

于 2012-04-12T17:45:38.697 回答
0

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

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

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

于 2012-04-12T17:46:20.157 回答