[英]How can I get the compiler aliases of ValueTuple field names for reflection
ValueTuples
allow for compiler aliases for their public fields ( Item1
, Item2
, etc...). ValueTuples
允许为其公共字段( Item1
、 Item2
等)使用编译器别名。 For example:例如:
var tuple = (Name:"apple",Date:DateTime.Now);
var nameFieldValue = tuple.Name;//"apple"
//here tuple.Name is a compiler alias for tuple.Item1
Is there any way I can do the same thing via reflection?有什么办法可以通过反射做同样的事情吗?
var tuple = (Name:"apple",Date:DateTime.Now);
var nameFieldValue = tuple.GetType().GetField(nameof(tuple.Name)).GetValue(tuple);//null reference exception (the field is null)
I know I can do this:我知道我可以这样做:
var tuple = (Name:"apple",Date:DateTime.Now);
var nameFieldValue = tuple.GetType().GetField("Item1").GetValue(tuple);//"apple"
But I need to get the public fields based on their compiler aliases ( tuple.Name
), not the actual field names ( tuple.Item1
).但是我需要根据它们的编译器别名(
tuple.Name
)而不是实际的字段名称( tuple.Item1
)来获取公共字段。
Tuple value names are a C# language construct akin to local variables and have no existence after the code is compiled.元组值名称是类似于局部变量的 C# 语言结构,编译代码后不存在。
The compiler will translate:编译器将翻译:
var tuple = (Name:"apple",Date:DateTime.Now);
var nameFieldValue = tuple.Name;
to:至:
ValueTuple<string, DateTime> valueTuple = new ValueTuple<string, DateTime>("apple", DateTime.Now);
string item = valueTuple.Item1;
and if you assign that tuple to another tuple with the same structure:如果您将该元组分配给另一个具有相同结构的元组:
var tuple = (Name:"apple",Date:DateTime.Now);
(string foo, DateTime bar) otherTuple = tuple;
the complier will just generate this code:编译器只会生成以下代码:
ValueTuple<string, DateTime> valueTuple = new ValueTuple<string, DateTime>("apple", DateTime.Now);
ValueTuple<string, DateTime> valueTuple2 = valueTuple;
Try or yourself on https://sharplab.io/在https://sharplab.io/上尝试一下
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.