Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

I can't get parameter names from valuetuple via reflection in c# 7.0

I want to Map a ValueTuple to a class using reflection. Documentation says that there is a Attribute attached to ValueTuple with parameters names (others than Item1, Item2, etc...) but I can't see any Attribute.

Disassembly shows nothing.

What's happens?

Example:

public static T ToStruct<T, T1,T2>(this ValueTuple<T1,T2> tuple) where T : struct

Via reflection can't get Item1, Item2 names to match with T fields via reflection.

like image 876
RamonEeza Avatar asked Apr 19 '17 07:04

RamonEeza


2 Answers

You should have the TupleElementNames attribute on the method created by the compiler.

See this code:

public class C {
    public (int a, int b) M() {

        return (1, 2);
    }
}

Which compiles to:

[return: TupleElementNames(new string[] {
    "a",
    "b"
})]
public ValueTuple<int, int> M()
{
    return new ValueTuple<int, int>(1, 2);
}

You can get that attribute using this code:

Type t = typeof(C);
MethodInfo method = t.GetMethod(nameof(C.M));
var attr = method.ReturnParameter.GetCustomAttribute<TupleElementNamesAttribute>();

string[] names = attr.TransformNames;
like image 110
Patrick Hofman Avatar answered Sep 19 '22 22:09

Patrick Hofman


As Patrick pointed out above, you can use reflection to inspect the tuple names used in the declaration of your method. But that gives you no information given that your ToStruct method signature shows no names. And, in any case, that gives you no information about tuples that will actually be passed into that method.

The runtime type is only ValueTuple (no names). The names only help at compile time, as syntactic sugar for ItemN.


From the design notes:

Name erasure at runtime

Importantly, the tuple field names aren't part of the runtime representation of tuples, but are tracked only by the compiler.

As a result, the field names will not be available to a 3rd party observer of a tuple instance - such as reflection or dynamic code.


You can read more about that at http://mustoverride.com/tuples_names/

like image 35
Julien Couvreur Avatar answered Sep 20 '22 22:09

Julien Couvreur