如何检测对象是否是 ILookup<,>并打印它?
我正在尝试制作一个非常基本的通用对象打印机用于调试,受到 LinqPad 中令人惊叹的功能的启发。
下面是我的打印函数的伪代码。我的 Reflection-foo 目前有点弱,我正在努力处理对象是 ILookup 的情况,因为我想枚举查找,将每个键与其关联的集合一起打印。
ILookup 没有非通用接口,也没有实现 IDictionary,所以我现在有点卡住了,因为我不能说 o as ILookup
...就此而言,我想知道如何深入研究任何通用接口...假设我想要 CustomObject<,,>
的特殊情况。
void Print(object o)
{
if(o == null || o.GetType().IsValueType || o is string)
{
Console.WriteLine(o ?? "*nil*");
return;
}
var dict = o as IDictionary;
if(dict != null)
{
foreach(var key in (o as IDictionary).Keys)
{
var value = dict[key];
Print(key + " " + value);
}
return;
}
//how can i make it work with an ILookup?
//?????????
var coll = o as IEnumerable;
if(coll != null)
{
foreach(var item in coll)
{ print(item); }
return;
}
//else it's some object, reflect the properties+values
{
//reflectiony stuff
}
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
我不确定你想要确切地完成什么,但是为了回答你的具体问题,你可以使用这样的反射:
我尝试以这样的方式编写它,以便你可以以强的方式编写打印逻辑:使用泛型的类型化方式。如果您愿意,您可以进行更多反射,以从查找中的每个
IGrouping<,>
中获取键和值。编辑:顺便说一句,如果您使用的是 C# 4,则可以将
if
语句的整个主体替换为:I'm not sure what you're trying to accomplish exactly, but to answer your specific question, you can use reflection like this:
I've tried to write it in such a way that you can write the printing logic in a strongly-typed manner with generics. If you prefer, you can instead do even more reflection to get the key and values out of each
IGrouping<,>
in the lookup.EDIT: By the way, if you are on C# 4, you can replace the entire body of the
if
statement with:多态性可能会让你的代码更简单一些。
Polymorphism might make your code a little simpler.
要确定该类型使用反射实现某些泛型接口:
泛型类型的名称修饰模式为 对于泛型
类型的特定实例:
在本例中,
ILookup<,>
有两个参数所以它是:我们对确切的实例不感兴趣,所以我们不需要指定类型参数。
To determine that the type implements some generic interface using reflection:
The pattern for the name mangling for generic types is
For a specific instance of a generic type:
In this case,
ILookup<,>
had two parameters so it's:We're not interested in the exact instance so we don't need to specify the type parameters.