Как определить, какой объект [] передается в качестве параметра? - PullRequest
2 голосов
/ 25 июня 2009

Я думаю, что эту проблему можно решить с помощью отражения (технология, в которой я не слишком уверен).

Мой код получает некоторые объекты кода, которые были сериализованы в 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)

Мне нужно справиться со следующими делами:

объект [] содержит:

  1. ничего, в таком случае я звоню DoSomeWork (NULL, NULL);

  2. массив только KeyValuePairType, в этом случае я звоню DoSomeWork (KeyValuePairType [], нуль);

  3. массив только KeyValueListPair, в этом случае я звоню DoSomework (нуль, KeyValueListPair []);

  4. или массив каждого, в этом случае я вызвать DoSomework (KeyValuePairType [], KeyValueListPair []);

Любые идеи приветствуются.

Спасибо

Оказывается, массив объектов содержит случайную последовательность дискретных объектов. Первоначально я был убежден, что это может быть последовательность дискретизаций и массивов этих объектов.

Поскольку операторы LINQ будут охватывать все возможные варианты.

Могу ли я сказать большое спасибо тем, кто ответил. Я отправил +1 для тех, кто отвечает с заявлениями LINQ.

Ответы [ 5 ]

5 голосов
/ 25 июня 2009

Если у вас есть 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 голос
/ 25 июня 2009

Как насчет этого:

object[] objects = GetObjects();

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

DoSomeWork(pairs, lists);
1 голос
/ 25 июня 2009

Вы можете сделать это, используя LINQ в C # 3, например:

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, за счет краткости.

0 голосов
/ 25 июня 2009

Убедившись, что object [] не равен NULL и имеет длину больше 1, вы можете просто вызвать GetType для объектов в массиве.

objectArray[0].GetType().FullName

вернет либо

"Namespace.KeyValuePairType"

или

"Namespace.KeyValueListPair"
0 голосов
/ 25 июня 2009

Отчасти это зависит от того, как обрабатываются отдельные элементы, но в целом ключевые слова равны и , так как должны хорошо работать для проверки отдельных объектов объекта [] и присвоение их соответствующему выводу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...