将 Dictionary<SomeEnum, dynamic> 的值转换为元组失败

Casting value of Dictionary<SomeEnum, dynamic> to an tuple fails

我有一个字典,其中包含一个已知类型的键(在给定的示例中:字符串)和一个元组作为值。我想在应用程序中传递这个字典,通常可以使用字典的键轻松解压数据(在实际应用程序中它不是字符串)。

但是我有一个用例,其中我只对元组的第一个元素感兴趣,我只知道元组中有多少其他元素,但是当我收到词典.

// Some place of the application defines the dictionary like this and adds some values...
var dictionary = new Dictionary<string, dynamic>();
dictionary.Add("key", ("I'm interested in this tuple element only", new List<int>().ToImmutableList()));


// In some other place of the application, I get the dictionary from above, but I'm interested only 
// in the first element of the tuple, from the other elements I don't know the type so I try
// to access it like:
(string valueOfInterest, object) element = dictionary["key"];    

// Do something with valueOfInterest

但是这段代码给了我一个

Microsoft.CSharp.RuntimeBinder.RuntimeBinderException: 
Cannot implicitly convert type System.ValueTuple<string,System.Collections.Immutable.ImmutableList<int>>' 
to 'System.ValueTuple<string,object>'

所以我想知道如何通过将元组转换为对象来仅访问元组的第一个元素和 "discard" 其他元素(或者如果可能的话)。

如果您只需要第一个值,请尝试使用未命名的元组语法并获取 Item1 属性.

var element = dictionary["key"];
var value = element.Item1;

直到字典中的值为 Tuple

根据Resolution of the Deconstruct method规格

This implies that rhs cannot be dynamic and that none of the parameters of the Deconstruct method can be type arguments.

在我遇到的 dynamic 的大多数用途中,弊大于利。它很重,而且没有保证的结果。

dynamic 只不过是 object,上面有很多编译器和运行时工作。

如果您不知道元组的形状,您应该知道 all value tuple structs implement ITuple 并且每个元素都有一个索引器:

var value = (dictionary["key"] as ITuple)[0];