[英]How to determine what object[] passed as parameter contains?
我认为可以使用反射(我不太确定的技术)来解决此问题。
我的代码正在接收一些在运行时已序列化为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 []包含:
在这种情况下我什么都没有打电话给DoSomeWork(null,null)
仅由KeyValuePairType组成的数组,在这种情况下,我称为DoSomeWork(KeyValuePairType [],null);
仅由KeyValueListPair组成的数组,在这种情况下,我称为DoSomework(null,KeyValueListPair []);
或每个数组,在这种情况下,我称为DoSomework(KeyValuePairType [],KeyValueListPair []);
任何想法都欢迎。
谢谢
事实证明,对象数组包含离散对象的随机序列。 最初,我被引导相信这可能是这些对象的离散和数组序列。
因为它是LINQ语句,所以将涵盖所有可能发生的情况。
我能对那些回答的人表示非常感谢。 对于那些使用LINQ语句回答的人,我已经发布了+1。
假设您可以使用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);
}
您可以在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
来使其速度更快一点,但这样做的代价是简洁。
这个怎么样:
object[] objects = GetObjects();
var pairs = objects.OfType<KeyValuePairType[]>().FirstOrDefault();
var lists = objects.OfType<KeyValueListPair[]>().FirstOrDefault();
DoSomeWork(pairs, lists);
确保object []不为null并且长度大于1后,可以仅对数组中的对象调用GetType。
objectArray[0].GetType().FullName
将返回
"Namespace.KeyValuePairType"
要么
"Namespace.KeyValueListPair"
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.