说我有一些使用类似方法的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
所示的最后一行给了我一个错误。我可以在这里正确返回元组吗?
答案 0 :(得分:7)
根据编译器错误消息,不能对动态值使用解构。
在这种情况下,您知道您的方法将返回一个元组,因此可以将结果强制转换为该元组:
(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);
}