Как определить, какой объект [] передается в качестве параметра?

2

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

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

У меня есть следующие случаи, чтобы справиться с:

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

  • ничто в этом случае я не вызываю DoSomeWork (NULL, NULL);

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

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

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

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

Спасибо

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

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

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

Теги:
reflection

5 ответов

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);
}
  • 0
    Как я понимаю вопрос, «значения» могут содержать массивы KeyValuePairType или KeyValueListPair, а не простые элементы.
  • 0
    Это возможно - это не очень понятно. Если это так, мы должны вызывать DoSomeWork несколько раз? ОП, уточни пожалуйста!
Показать ещё 1 комментарий
1

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

object[] objects = GetObjects();

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

DoSomeWork(pairs, lists);
1

Вы можете сделать это, используя LINQ в С# 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

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

-1

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

objectArray[0].GetType().FullName

вернет либо

"Namespace.KeyValuePairType"

или

"Namespace.KeyValueListPair"
  • 0
    GetType () почти никогда не является правильным способом проверки подходящих типов, а сравнение имен подходит еще реже. Это / как ваши друзья, если вам нужно сделать это для отдельного объекта. OfType или Cast подходят для коллекций.
  • 0
    Хотя всегда полезно отвечать передовыми методами, я думаю, что нет ничего плохого в предоставлении всех доступных решений. В конце концов, это скорее учебная платформа, чем платформа для генерации производственного кода.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню