我有一个用例,我需要检查一个值是否是C#7 ValueTuple,如果是,则循环遍历每个项目.我试着用检查obj is ValueTuple
和obj is (object, object)
但是这两个的返回false.我发现我可以使用obj.GetType().Name
并检查它是否以它开头,"ValueTuple"
但这对我来说似乎很蹩脚.任何替代品都会受到欢迎.
我也有获得每个项目的问题.我尝试Item1
使用此处找到的解决方案:如何检查c#中动态匿名类型上是否存在属性?但((dynamic)obj).GetType().GetProperty("Item1")
返回null.我希望我能做一件事while
来获得每件物品.但这不起作用.我如何获得每件商品?
更新 - 更多代码
if (item is ValueTuple) //this does not work, but I can do a GetType and check the name
{
object tupleValue;
int nth = 1;
while ((tupleValue = ((dynamic)item).GetType().GetProperty($"Item{nth}")) != null && //this does not work
nth <= 8)
{
nth++;
//Do stuff
}
}
Run Code Online (Sandbox Code Playgroud) 我想使用反射将ValueTuple映射到类.文档说有一个属性附加到ValueTuple有参数名称(除了Item1,Item2等...)但我看不到任何属性.
反汇编没有显示任何内容.
发生什么事?
例:
public static T ToStruct<T, T1,T2>(this ValueTuple<T1,T2> tuple) where T : struct
Run Code Online (Sandbox Code Playgroud)
通过反射无法通过反射获得Item1,Item2名称与T字段匹配.
是否有更好的方法来执行以下操作:
public static class ValueTupleAdditions {
public static IEnumerable<object> ToEnumerable<A, B>(this ValueTuple<A, B> tuple) {
yield return tuple.Item1;
yield return tuple.Item2;
}
public static IEnumerable<object> ToEnumerable<A, B, C>(this ValueTuple<A, B, C> tuple) {
yield return tuple.Item1;
yield return tuple.Item2;
yield return tuple.Item3;
}
[etc]
}
Run Code Online (Sandbox Code Playgroud)
编辑:由于人们要求用例,所以你去.
using Xunit;
namespace Whatever {
public class SomeTestClass {
public static IEnumerable<(string, Expression<Func<string, string>>, string)> RawTestData() {
yield return ("Hello", str => str.Substring(3), "lo");
yield return ("World", str => str.Substring(0, 4), "worl");
}
public …
Run Code Online (Sandbox Code Playgroud) 我想这可能是一个方便的字典:
var myDict = new Dictionary<(int, int), bool>();
Run Code Online (Sandbox Code Playgroud)
哈希会是什么样子?
等效键类型(struct)是什么样的?
假设我有一个方法foo
可以返回ValueTuple
其中一个成员是一次性的,例如(IDisposable, int)
.
确保返回的一次性物体在呼叫方面正确配置的最佳方法是什么?
我尝试了以下方法:
using (var (disposable, number) = foo())
{
// do some stuff using disposable and number
}
Run Code Online (Sandbox Code Playgroud)
但这不会编译:
'(IDisposable disposable,int number)':using语句中使用的类型必须可以隐式转换为'System.IDisposable'
我是否真的需要将我的代码包装在try-finally块中并将我的对象显式地放在finally块中,或者有更好的方法吗?
实际上我希望看到新的ValueTuples实现IDisposable
接口并调用Dispose()
他们所有的一次性成员.这可能是微软有价值的功能要求吗?
我在C#中尝试使用ValueTuple类,我对属性命名有疑问,让我们看看:
如果实例化一个ValueTuple声明这样的对象:var tuple1 = (Name: "Name1", Age: 25);
我们可以命名属性,
但是,像这样: ValueTuple<string,int> tuple2 = (Name: "Name1", Age: 25);
我们得到一个警告,说明名字被忽略了,所以
我们应该输入: ValueTuple<string,int> tuple2 = ("Name1",25);
然后属性将是tuple2.Item1
和tuple2.Item2
有人能解释这个新手的原因吗?
比你有利
与ValueTuple
在C#7,现在可以编写回归方法和属性或不明确声明类型消耗复合对象。然而,当没有提供文档时,这些命名元组可能会造成混淆。
由于记录库的主要并且可能是最方便的方法是使用 XML 文档,有没有什么方法可以使用 XML 文档来提供命名元组中变量的描述?
我知道显而易见的解决方案是声明一个类型并相应地记录它。但是,由于某些无法完成的“原因”,是否可以将 XML 文档中的数据成员记录在ValueTuple
?
注: 类似的问题被问的来临之前ValueTuple
。
我考虑将我的System.ValueTuple
参考文献从4.4.0 更新到(当前)4.5.0。
为了避免回归,我想找出这两个版本之间的变化。该的NuGet页说:
发行说明
链接到.NET Core github存储库。
“发行说明”链接是否损坏,或者.NET Core github存储库是否实际上包含其更改日志System.ValueTuple
?如果是后者,它到底在哪里?我尝试在System.ValueTuple
存储库中进行搜索,这会产生一些结果,但是并没有帮助我找到4.4.0和4.5.0版本之间的更改。
ValueTuple.IComparable.CompareTo(Object)的文档说它返回:
0如果other是ValueTuple实例; 否则,1如果other为null.
这使得IComparable
实现看起来似乎毫无用处,除了可能没有破坏可能期望实现接口的代码.旧的引用Tuple
类确实遵循标准实现(尽管它可能仅在项支持时才有效IComparable
).
文档IComparable
说明了可以对类型进行排序,但情况并非如此ValueTuple
:
此接口由可以对其值进行排序或排序的类型实现.它要求实现类型定义了一个方法,的CompareTo,指示当前实例的排序顺序的位置是否是前,后,或相同的相同类型的第二个目的.(......)
CompareTo方法的实现必须返回具有三个值之一的Int32,如下表所示.
小于零当前实例位于排序顺序中CompareTo方法指定的对象之前.
零此当前实例出现在排序顺序中与CompareTo方法指定的对象相同的位置.
大于零此当前实例遵循排序顺序中CompareTo方法指定的对象.
所以我的问题是:
ValueTuple
实现CompareTo
呢?IComparable
即使它不支持有意义的排序?声明为字段的 ValueTuple 类型可以是可变的:
class Foo {
(int, int) bar = (0, 1);
}
Run Code Online (Sandbox Code Playgroud)
或只读:
class Foo {
readonly (int, int) bar = (0, 1);
}
Run Code Online (Sandbox Code Playgroud)
这种(不变)可变性适用于每个成员。我希望它也能扩展到 const 声明:
class Foo {
const (int, int) bar = (0, 1);
}
Run Code Online (Sandbox Code Playgroud)
但是这个语句不能编译。在某些情况下,它是不受欢迎的功能,还是只是未实现的功能?
编辑 好的,我现在明白了。我的问题是基于这样一个假设,即 C# 编译器对 ValueTuples 的处理方式与其他类型不同,关于关键字 readonly。所以,如果它已经是一个例外,为什么不为 consts 设置另一个例外。但是,实际上,这种逻辑似乎适用于所有结构体。所以这行不通:
class Foo {
readonly ExampleStruct field;
void Method() {
field.structField = 2;
}
}
struct ExampleStruct {
public int structField;
}
Run Code Online (Sandbox Code Playgroud) valuetuple ×10
c# ×9
c#-7.0 ×4
.net ×2
c#-7.3 ×1
dictionary ×1
icomparable ×1
idisposable ×1
ienumerable ×1
using ×1