简体   繁体   中英

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...). 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 value names are a C# language construct akin to local variables and have no existence after the code is compiled.

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/

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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