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

爱⌒轻易说出口 提交于 2019-11-28 03:31:40

问题


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.


回答1:


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;



回答2:


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/



来源:https://stackoverflow.com/questions/43488888/i-cant-get-parameter-names-from-valuetuple-via-reflection-in-c-sharp-7-0

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!