C# 调用dll';时无法解构动态对象;s法

C# 调用dll';时无法解构动态对象;s法,c#,dynamic,dll,tuples,C#,Dynamic,Dll,Tuples,假设我有一些dll,其方法如下: public (string, List<string>) MyMethod(NameValueCollection Settings, MyClass1 params) { //do something return (result, errorList); } public(字符串,列表)MyMethod(NameValueCollection设置,MyClass1参数) { //做点什么 返回(结果、错误列表); } 现在从我的主要项目

假设我有一些dll,其方法如下:

public (string, List<string>) MyMethod(NameValueCollection Settings, MyClass1 params)
{
 //do something
 return (result, errorList);
}
public(字符串,列表)MyMethod(NameValueCollection设置,MyClass1参数)
{
//做点什么
返回(结果、错误列表);
}
现在从我的主要项目开始,我将这样称呼它:

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);
var shipmentNumber=string.Empty;
var errorList=新列表;
var DLL=Assembly.LoadFile($@“{AppDomain.CurrentDomain.BaseDirectory}{appSettings[$”{parameters.TestCase}u DLL_Name“]}”);
类型类类型;
classType=DLL.GetType($“{appSettings[$”{parameters.TestCase}}\u DLL_Name].Replace(“.DLL”,”“)}.MyService”);
动态d=Activator.CreateInstance(类类型);
(结果,错误列表)=d.MyMethod(应用设置,参数);

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

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

在本例中,您知道您的方法将返回一个元组,因此可以将结果强制转换为:

(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);
}