Я думаю, что эту проблему можно отсортировать с помощью отражения (технологию, о которой я не слишком уверен).
Мой код получает некоторые объекты кода, которые были сериализованы для 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.
Предполагая, что у вас есть 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);
}
Как насчет этого:
object[] objects = GetObjects();
var pairs = objects.OfType<KeyValuePairType[]>().FirstOrDefault();
var lists = objects.OfType<KeyValueListPair[]>().FirstOrDefault();
DoSomeWork(pairs, lists);
Вы можете сделать это, используя 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
ценой краткости.
Убедившись, что объект [] не является нулевым и имеет длину больше 1, вы можете просто вызвать GetType для объектов в массиве.
objectArray[0].GetType().FullName
вернет либо
"Namespace.KeyValuePairType"
или
"Namespace.KeyValueListPair"