Search code examples
c#c#-7.0valuetuple

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.


Solution

  • 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;