如何确定作为参数传递的 object[] 包含什么内容?

3
我认为可以使用反射技术(一种我不太了解的技术)来解决这个问题。
我的代码在运行时接收到一些被序列化为XML的代码对象。当我接收并反序列化它时,有一个字段给我带来了一些麻烦。
有一个字段可以包含以下数据类的组合(为了清晰起见做了简化):
class KeyValuePairType
{
  public string Key;
  public string Value;
}

class KeyValueListPair
{
  public string Key;
  public string[] Value;
}

我将这些作为 object[] 对象接收到我的代码中,需要在运行时确定它们包含的内容,以便可以调用本地对象上需要 KeyValuePairType[] 和 KeyValueListPair[] 作为参数的接口,例如:

public DoSomeWork(KeyValuePairType[] data1, KeyValueListPair[] data2)

我需要应对以下情况:
object[] 包含:
  1. 没有任何元素,此时我调用 DoSomeWork(null,null);

  2. 仅包含 KeyValuePairType 的数组,此时我调用 DoSomeWork(KeyValuePairType[],null);

  3. 仅包含 KeyValueListPair 的数组,此时我调用 DoSomework(null, KeyValueListPair[]);

  4. 同时包含这两种数组,此时我调用 DoSomework(KeyValuePairType[],KeyValueListPair[]);

欢迎提出任何想法。
非常感谢回答的人。最初我认为这个对象数组可能是离散对象的序列,或包含这些对象的数组序列。
正如所述,LINQ 语句将涵盖所有情况。
5个回答

5
假设您已经可以使用LINQ...
假设您已经掌握了LINQ...
public void Foo(object[] values)
{
    var pairs = values.OfType<KeyValuePairType>().ToArray();
    var lists = values.OfType<KeyValueListPair>().ToArray();

    pairs = pairs.Length == 0 ? null : pairs;
    lists = lists.Length == 0 ? null : lists;

    DoSomeWork(pairs, lists);
}

据我理解这个问题,“values”可以包含KeyValuePairType或KeyValueListPair的数组,而不是简单的元素。 - bruno conde
这是可能的 - 但不是很清楚。如果是这种情况,我们需要多次调用DoSomeWork吗?楼主,请澄清一下! - Jon Skeet
起初我自己也不确定,一直试图处理离散对象和这些对象的数组的混合。结果证明它是由离散对象混合而成的。 - ChrisBD

1

您可以使用C# 3中的LINQ来完成此操作,如下所示:

void HandleThings(params object[] values) {
    var pairTypes = values.OfType<KeyValuePairType>().ToArray();
    var listPairs = values.OfType<KeyValueListPair>().ToArray();

    DoSomeWork(pairTypes.Any() ? pairTypes : null, listPairs.Any() ? listPairs : null);
}

你可以通过将.Any()替换为.Length > 0来稍微提高速度,但代价是代码变得更冗长。


1
这样怎么样:
object[] objects = GetObjects();

var pairs = objects.OfType<KeyValuePairType[]>().FirstOrDefault();
var lists = objects.OfType<KeyValueListPair[]>().FirstOrDefault();

DoSomeWork(pairs, lists);

0

这要看个体元素如何被处理,但一般来说,isas关键字应该可以很好地用于检查对象数组中的单个对象,并将它们分配到适当的输出。


-2

在确保 object[] 不为 null 且长度大于 1 后,您可以直接调用数组中对象的 GetType 方法。

objectArray[0].GetType().FullName

将返回任一

"Namespace.KeyValuePairType"

或者

"Namespace.KeyValueListPair"

GetType()几乎永远不是检查适当类型的正确方式 - 比较名称的情况更少。如果您需要为单个对象执行此操作,is/as 是您的朋友。对于集合,使用OfType或Cast会更合适。 - Jon Skeet
虽然回答最佳实践总是好的,但我认为提供所有可用的解决方案也没有错。毕竟,这更像是一个学习平台而不是生产代码生成平台。 - Serhat Ozgel
我不同意。当一个解决方案低效且容易出错时,我会将其投票为不适合推荐给他人的选项。 - Jon Skeet

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接