代码之家  ›  专栏  ›  技术社区  ›  5argon

如何从对象转换为元组(valuetuple)类型?

c#
  •  4
  • 5argon  · 技术社区  · 6 年前

    我使用反射获取类型的返回值 object ,但它的实际类型是 (int[], string[]) 我要和 obj.GetType().ToString() 还有指纹 System.ValueTuple`2[System.Int32[],System.String[]] 是的。

    但只是和 ((int[], string[]))obj (ValueTuple<int[],string[]>)obj 返回强制转换无效。如何正确地做到这一点?

    1 回复  |  直到 6 年前
        1
  •  1
  •   5argon    6 年前

    好吧,我终于成功了。

    可以进一步反映 ValueTuple 的字段 ItemX 是的。不确定是否有其他不那么强迫的方法可以让我们得到完整的元组。

    using System;
    
    namespace CTest
    {
        class Program
        {
            static void Main(string[] args)
            {
                Test t = new Test();
                var tuple = typeof(Test).GetMethod(nameof(t.ReturnTuple)).Invoke(t, null);
                int[] i = (int[])typeof((int[], string[])).GetField("Item1").GetValue(tuple);
                string[] s = (string[])typeof((int[], string[])).GetField("Item2").GetValue(tuple);
    
                foreach (int data in i)
                {
                    Console.WriteLine(data.ToString());
                }
                foreach (string data in s)
                {
                    Console.WriteLine(data);
                }
    
                // Output :
                // 1
                // 2
                // 3
                // a
                // b
                // c
            }
        }
    
        class Test
        {
            public (int[], string[]) ReturnTuple() => (new int[] { 1, 2, 3 }, new string[] { "a", "b", "c" });
        }
    }