调用dll方法时无法解构动态对象

6

假设我有一些包含以下方法的dll:

public (string, List<string>) MyMethod(NameValueCollection Settings, MyClass1 params)
{
 //do something
 return (result, errorList);
}

现在从我的主项目中这样调用它:
var shipmentNumber = string.Empty;
var errorList = new List<string>;
var DLL = Assembly.LoadFile($@"{AppDomain.CurrentDomain.BaseDirectory}{appSettings[$"{parameters.TestCase}_DLL_Name"]}");
Type classType;
classType = DLL.GetType($"{appSettings[$"{parameters.TestCase}_DLL_Name"].Replace(".dll", "")}.MyService");
dynamic d = Activator.CreateInstance(classType);
(result, errorList)= d.MyMethod(appSettings, params);

然而,在这里显示的最后一行中,我遇到了一个错误:无法解构动态对象。有没有办法在此处正确返回元组?


顺便提一下,如果有一个 [mcve],这个问题会更好。问题可以在单个程序集中轻松地重现(反射部分无关紧要)- 一个小的控制台应用程序将展示相同的行为,此时读者更容易调整事物。(这只是让你考虑一下下一个问题。) - Jon Skeet
下次我会尽量保持最低限度。 - Yuropoor
1个回答

21

根据编译器错误消息,您不能在动态值中使用解构。

在这种情况下,您知道您的方法将返回一个元组,所以要么将结果转换为元组:

(result, errorList) = ((string, List<string>)) d.MyMethod(appSettings, params);

或者将其分配给元组,然后解构:

(string, List<string>) tuple = d.MyMethod(appSettings, params);
(result, errorList) = tuple;
请注意,使用双括号进行强制类型转换看起来有点奇怪,但它们是必要的:外部括号用于转换语法;内部括号用于元组类型语法。
这是一个完整简单的例子:
using System;

class Test
{
    static void Main()
    {
        dynamic d = new Test();

        // Variables we want to deconstruct into
        string text;
        int number;

        // Approach 1: Casting
        (text, number) = ((string, int)) d.Method();

        // Approach 2: Assign to a tuple variable first
        (string, int) tuple = d.Method();
        (text, number) = tuple;

    }

    public (string, int) Method() => ("text", 5);
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接