Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何从对象转换为元组(ValueTuple)类型?_C# - Fatal编程技术网

C# 如何从对象转换为元组(ValueTuple)类型?

C# 如何从对象转换为元组(ValueTuple)类型?,c#,C#,我使用了一个反射来获取类型为object的返回值,但是它的实际类型是(int[],string[])我用obj.GetType().ToString()进行了双重检查,并打印了System.ValueTuple`2[System.Int32[],System.string[] 但仅使用((int[],string[])obj或(ValueTuple)obj进行强制转换将返回强制转换无效。如何正确执行此操作?好的,我终于让它工作了 可以进一步反映ValueTuple的字段ItemX。不确定是否有其

我使用了一个反射来获取类型为
object
的返回值,但是它的实际类型是
(int[],string[])
我用
obj.GetType().ToString()
进行了双重检查,并打印了
System.ValueTuple`2[System.Int32[],System.string[]


但仅使用
((int[],string[])obj
(ValueTuple)obj进行强制转换将返回强制转换无效。如何正确执行此操作?

好的,我终于让它工作了

可以进一步反映
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" });
    }
}

第一次强制转换需要一组额外的括号:
((int[],string[])obj
。啊,是的,很抱歉我就是这么做的,它返回的强制转换无效。可能是您的项目针对的是不支持元组的旧C语言版本吗?为什么需要这样做?也许解释一下你想要实现的目标可以引导你找到正确的解决方案。我的意思是try:((int[],string[]))obj.Value。如果这不起作用,请尝试GetType、GetProperty和GetValue,如Heinzi的回答所示: