print_r()C#中的PHP函数

时间:2012-03-06 09:33:30

标签: c#

所以我正在尝试编写一个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();
        }
    }
}

3 个答案:

答案 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