如何确定哪个对象[]作为参数包含?

时间:2009-06-25 16:40:28

标签: c# reflection

我认为这个问题可以使用反射(一种我不太确定的技术)进行分类。

我的代码正在接收一些在运行时已序列化为XML的代码对象。当我收到它并对其进行反序列化时,一个字段会让我感到麻烦。

有一个字段可以包含以下数据类的组合(为简洁起见而简化):

class KeyValuePairType
{
  public string Key;
  public string Value;
}

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

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

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

我有以下案例可以应对:

object []包含:

  1. 我打电话的情况都没有 DoSomeWork(NULL,NULL);

  2. 仅限KeyValuePairType数组, 在这种情况下我打电话 DoSomeWork(KeyValuePairType [], 空);

  3. 仅限KeyValueListPair数组, 在这种情况下我打电话 DoSomework(NULL, KeyValueListPair []);

  4. 或每个的数组,在这种情况下我 调用DoSomework(KeyValuePairType [], KeyValueListPair []);

  5. 欢迎任何想法。

    谢谢

    事实证明,对象数组包含随机的离散对象序列。最初,我被引导相信它可能是一系列离散和这些对象的数组。

    因为LINQ语句将涵盖所有可能性。

    我能否对那些回答的人表示非常感谢。我已经为那些回答LINQ语句的人发布了+1。

5 个答案:

答案 0 :(得分:5)

假设你有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);
}

答案 1 :(得分: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,以简洁为代价,使其速度更快。

答案 2 :(得分:1)

这个怎么样:

object[] objects = GetObjects();

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

DoSomeWork(pairs, lists);

答案 3 :(得分:0)

在某种程度上取决于如何处理各个元素,但一般情况下,isas关键字应该可以正常检查object []数组中的单个对象,并将它们分配给适当的输出。

答案 4 :(得分:-2)

确保object []不为null且长度大于1后,您只需在数组中的对象上调用GetType即可。

objectArray[0].GetType().FullName

将返回

"Namespace.KeyValuePairType"

"Namespace.KeyValueListPair"