繁体   English   中英

如何获取 ValueTuple 字段名称的编译器别名以进行反射

[英]How can I get the compiler aliases of ValueTuple field names for reflection

ValueTuples允许为其公共字段( Item1Item2等)使用编译器别名。 例如:

    var tuple = (Name:"apple",Date:DateTime.Now);
    var nameFieldValue = tuple.Name;//"apple"
    //here tuple.Name is a compiler alias for tuple.Item1

有什么办法可以通过反射做同样的事情吗?

    var tuple = (Name:"apple",Date:DateTime.Now);
    var nameFieldValue = tuple.GetType().GetField(nameof(tuple.Name)).GetValue(tuple);//null reference exception (the field is null)

我知道我可以这样做:

    var tuple = (Name:"apple",Date:DateTime.Now);
    var nameFieldValue = tuple.GetType().GetField("Item1").GetValue(tuple);//"apple"

但是我需要根据它们的编译器别名( tuple.Name )而不是实际的字段名称( tuple.Item1 )来获取公共字段。

元组值名称是类似于局部变量的 C# 语言结构,编译代码后不存在。

编译器将翻译:

var tuple = (Name:"apple",Date:DateTime.Now);
var nameFieldValue = tuple.Name;

至:

ValueTuple<string, DateTime> valueTuple = new ValueTuple<string, DateTime>("apple", DateTime.Now);
string item = valueTuple.Item1;

如果您将该元组分配给另一个具有相同结构的元组:

var tuple = (Name:"apple",Date:DateTime.Now);
(string foo, DateTime bar) otherTuple = tuple;

编译器只会生成以下代码:

ValueTuple<string, DateTime> valueTuple = new ValueTuple<string, DateTime>("apple", DateTime.Now);
ValueTuple<string, DateTime> valueTuple2 = valueTuple;

https://sharplab.io/上尝试一下

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM