简体   繁体   English

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

[英]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允许为其公共字段( Item1Item2等)使用编译器别名。 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.

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