所以我正在尝试编写一个C#函数print_r(),它以与PHP print_r()函数相同的方式打印出有关传递值的信息。
我正在做的是将一个对象作为函数的输入,并根据它的类型,输出值,或循环遍历数组并打印出数组中的值。我打印出基本值没有问题,但当我尝试循环访问该对象时,如果我检测到它是一个数组,我从C#中得到一个错误,说“错误1 foreach语句不能对'object'类型的变量进行操作,因为'对象' '不包含'GetEnumerator'的公共定义。“
现在我假设这只是因为对象没有实现IEnumerable<>,但有什么方法可以处理这个输入作为类型对象吗?
这是我当前的函数代码(IEnumerable<>部分在内容方面是空白的,但这是给我错误的代码。
感谢。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Collections;
using System.Reflection;
namespace ConsoleApplication1
{
class Program
{
static void print_r(object val)
{
if (val.GetType() == typeof(string))
{
Console.Write(val);
return;
}
else if (val.GetType().GetInterface(typeof(IEnumerable).FullName) != null)
{
foreach (object i in val)
{
// Process val as array
}
}
else
{
Console.Write(val);
return;
}
}
static void Main(string[] args)
{
int[] x = { 1, 4, 5, 6, 7, 8 };
print_r(x);
Console.Read();
}
}
}
答案 0 :(得分:5)
值声明为Object。在检查它是否为IEnumerable
之后(如图所示,您可以使用is
进行操作,但这也适用于原始代码),您必须明确地将其强制转换
else if (val is IEnumerable)
{
var e = val as IEnumerable;
foreach (var i in e)
{
Console.WriteLine(i.ToString());
}
}
答案 1 :(得分:0)
有LINQPad有Dump()扩展方法,但你只能在LINQPad中使用它 我们可以编写自己的扩展方法将任何对象转储到html并在浏览器中查看 您需要引用LINQPad.exe
public static class Extension
{
public static void Dump<T>(this T o)
{
string localUrl = Path.GetTempFileName() + ".html";
using (var writer = LINQPad.Util.CreateXhtmlWriter(true))
{
writer.Write(o);
File.WriteAllText(localUrl, writer.ToString());
}
Process.Start(localUrl);
}
}
答案 2 :(得分:0)
你必须使用反射这样做我想,我想要一个类似的功能,并使用反射将我的对象输出到表中。
我没有手头的代码,但找到了我的解决方案的基础here!