将 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];
我有一个字典,其中包含一个已知类型的键(在给定的示例中:字符串)和一个元组作为值。我想在应用程序中传递这个字典,通常可以使用字典的键轻松解压数据(在实际应用程序中它不是字符串)。
但是我有一个用例,其中我只对元组的第一个元素感兴趣,我只知道元组中有多少其他元素,但是当我收到词典.
// 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];