【问题标题】:Format any object array to string将任何对象数组格式化为字符串
【发布时间】:2021-05-25 09:53:27
【问题描述】:

如果对象是数组,我想返回它的字符串表示形式,如下所示:

using System;
using System.Linq;
using Xunit;
using Xunit.Abstractions;

namespace Tests.UnitTests
{
    enum TestEnum {
        A,
        B
    }

    public class MyClass {

        private readonly ITestOutputHelper _testOutputHelper;

        public static string ObjectToString(object? obj) {
            if (obj?.GetType().IsArray == true)
            {
                return string.Join(",", obj); // <-- does not work, returns "Tests.UnitTests.TestEnum[]"
                return string.Join(",", ((object[]) obj).AsEnumerable()); // <-- does not work, throws "Unable to cast object of type 'Tests.UnitTests.TestEnum[]' to type 'System.Object[]"
                return string.Join(",", ((Enum[]) obj).AsEnumerable()); // <-- does not work, throws "Unable to cast object of type 'Tests.UnitTests.TestEnum[]' to type 'System.Enum[]'"
            }
            return obj?.ToString() ?? "<unknown>";
        }

        public MyClass(ITestOutputHelper testOutputHelper)
        {
            _testOutputHelper = testOutputHelper;
        }

        [Fact]
        public void Test() {
            var val = new TestEnum[] { TestEnum.A, TestEnum.B };
            var result = ObjectToString(val);
            _testOutputHelper.WriteLine($"RESULT: {result}");
        }
    }
}

通常我需要检查 obj 是否为数组,将其转换为“任何”数组并将其值映射到字符串。我该怎么做?在示例中,我使用了枚举,但我想让它适用于任何类型值的数组,只想在每个数组元素上调用 ToString() 并连接结果。

【问题讨论】:

  • 试试:string.Join(",", obj.ToArray());
  • @jdweng:这不会按原样编译。

标签: c#


【解决方案1】:

您可以尝试转换为IEnumerable 并使用Cast&lt;Object&gt;

public static string ObjectToString(object? obj)
{
    if (obj is IEnumerable enumerable)
    {
        return string.Join(",", enumerable.Cast<Object>()); 
    }
    return obj?.ToString() ?? "<unknown>";
}

.Net fiddle

【讨论】:

  • object? 作为参数,真的会编译吗?
  • @JamshaidK.:我还没有使用 C#8 功能,但在 Linqpad 中它只提供了一个 warning。我只是在这里改编了 OP 的代码。如果您更改它,您将在提供的小提琴中得到相同的结果。
  • @JamshaidK.:现在更改了 fiddle 以显示它可以编译和运行,但带有警告。
  • 如果您使用的 .net 版本低于 5.0,则会出现错误。
  • @JamshaidK.: 但这是 OP 的代码,所以他似乎使用 .NET 5。这不是我的主意 ;)
猜你喜欢
  • 1970-01-01
  • 2021-05-10
  • 1970-01-01
  • 1970-01-01
  • 2016-04-13
  • 1970-01-01
  • 2010-10-16
  • 2016-09-23
  • 2011-10-14
相关资源
最近更新 更多