gpt4 book ai didi

c# - 如何检测对象是否为 Lookup<,> 并打印出来?

转载 作者:行者123 更新时间:2023-11-30 15:08:50 25 4
gpt4 key购买 nike

我正在尝试制作一个用于调试的非常基本的通用对象打印机,灵感来自您在 LinqPad 中获得的强大功能。

下面是我的打印函数的伪代码。我的 reflection-foo 目前有点弱,我正在努力处理对象是 ILookup 的情况,因为我想枚举查找,打印每个键及其关联的集合。

ILookup 没有非通用接口(interface),也没有实现 IDictionary,所以我现在有点卡住了,因为我不能说 o as ILookup<object,object> ...就此而言,我想知道如何深入研究任何通用接口(interface)...假设我想为 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
}
}

最佳答案

我不确定你到底想完成什么,但要回答你的具体问题,你可以像这样使用反射:

public static void PrintIfLookup(object obj)
{
if (obj == null)
throw new ArgumentNullException("obj");

// Find first implemented interface that is a constructed version of
// ILookup<,>, or null if no such interface exists.
var lookupType = obj
.GetType()
.GetInterfaces()
.FirstOrDefault
(i => i.IsGenericType &&
i.GetGenericTypeDefinition() == typeof(ILookup<,>));

if (lookupType != null)
{
// It is an ILookup<,>. Invoke the PrintLookup method
// with the correct type-arguments.

// Method to invoke is private and static.
var flags = BindingFlags.NonPublic | BindingFlags.Static;

// Assuming the containing type is called Foo.
typeof(Foo).GetMethod("PrintLookup", flags)
.MakeGenericMethod(lookupType.GetGenericArguments())
.Invoke(null, new[] { obj });
}

}

private static void PrintLookup<TKey, TElement>(ILookup<TKey, TElement> lookup)
{
// TODO: Printing logic
}

我尝试以这样一种方式编写它,您可以使用泛型以强类型方式编写打印逻辑。如果您愿意,您可以改为进行更多反射以从每个 IGrouping<,> 中获取键和值。在查找中。

编辑:顺便说一下,如果您使用的是 C# 4,则可以替换 if 的整个主体声明:

PrintLookup((dynamic)obj);

关于c# - 如何检测对象是否为 Lookup<,> 并打印出来?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5087314/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com