【问题标题】:Different action on parameter that could be array对可能是数组的参数的不同操作
【发布时间】:2011-04-27 18:58:29
【问题描述】:

这里的 T 可以是一个数组或单个对象。如何将数组添加到数组列表或将单个对象添加到同一个数组列表。这给了我一个构建时错误,AddRange 的重载匹配具有无效参数。

T loadedContent;
if (typeof(T).IsArray)
{
    contentArrayList.AddRange(loadedContent);
}
else
{
    contentArrayList.Add(loadedContent);
}

【问题讨论】:

  • contentArrayList的类型是什么?
  • 我删除了 XNA 标签,因为您的问题实际上是关于 C#。但是在 XNA 前端,需要对已加载的内容进行“列表”通常是非常不寻常的。就让ContentManager处理吧。
  • (在 C# 前面:这是对打字系统的相当公然的不使用。我可以回答你如何做到这一点......但你可能不应该这样做首先这样做。)

标签: c#


【解决方案1】:

编辑:在检查有关强制转换为类型Array 的一些规则后更正了我的答案。

所有特定类型的数组,例如 int[]、string[] 或 MyCustomObject[] 都派生自基类 Array,因此它们实现了 ICollection 接口,这就是 @987654328 @ 方法接受作为参数。

假设您的contentArrayList 变量是一个ArrayList 对象,您应该能够将您的loadedContent 变量转换为ICollection:

contentArrayList.AddRange((ICollection)loadedContent)

或者,您可以将检查它是否是数组与强制转换结合起来:

Array loadedContentAsArray = loadedContent as Array;
if (loadedContentAsArray != null)
{
    contentArrayList.AddRange(loadedContentAsArray);
}

【讨论】:

  • 实际上,您可以在T 参数上使用Type Constraint 以确保它实现ICollection 示例:where T : ICollection
【解决方案2】:

Wily 博士的学徒提供的解决方案可以,但我想做一些侧面 cmets。

如果您使用泛型但仍致力于特定数据类型,则您的代码中一定存在设计问题。基本上你破坏了泛型的目的,如 MSDN 所述:

泛型允许您定义类型安全的数据结构,而无需提交实际的数据类型。

也许你应该重新考虑一些重构,也许通过添加具有不同参数的方法或其他东西......

【讨论】:

  • 我并没有致力于特定的类型,而是一个对象数组或单个对象。这是因为 LoadContent 根据参数(单个或 [])返回其中任何一个
【解决方案3】:

如果你的 contentList 是 ArrayList 类型,我会那样做。

        ICollection contentArray = loadedContent as ICollection;
        if (contentArray != null)
            contentList.AddRange(contentArray);
        else
            contentList.Add(loadedContent);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-25
    • 2020-11-22
    • 1970-01-01
    相关资源
    最近更新 更多