Невозможно деконструировать динамический объект при вызове метода dll - PullRequest
0 голосов
/ 21 сентября 2018

Скажем, у меня есть некоторые 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.Есть ли способ, которым я мог бы правильно вернуть кортеж здесь?

1 Ответ

0 голосов
/ 21 сентября 2018

Согласно сообщению об ошибке компилятора, вы не можете использовать деконструкцию с динамическими значениями.

В этом случае вы знаете, что ваш метод собирается вернуть кортеж, поэтому либо приведите результат к этому:

(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);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...