【问题标题】:Cannot deconstruct dynamic object while calling dll's method调用dll的方法时无法解构动态对象
【发布时间】:2019-02-25 17:26:54
【问题描述】:

假设我有一些 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);

但是,这给了我在此处显示的最后一行 Cannot deconstruct dynamic objects 的错误。有没有办法可以在这里正确返回元组?

【问题讨论】:

  • 顺便说一句,这个问题可以通过minimal reproducible example 得到改善。该问题可以在单个程序集中轻松重现(反射部分无关紧要) - 一个小型控制台应用程序将展示相同的行为,此时读者更容易进行调整。 (只是为您的下一个问题考虑的事情。)
  • 我下次会,我认为我应该保持最低限度。

标签: c# dynamic dll tuples


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 2012-08-04
    • 1970-01-01
    • 2011-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-21
    • 1970-01-01
    相关资源
    最近更新 更多