我无法通过 c# 7.0 中的反射从值元组获取参数名称



我想使用反射映射一个值。文档说,有一个带有参数名称(其他item1,item2等(的估算值附加了一个属性,但我看不到任何属性。

拆卸一无所获。

发生了什么?

示例:

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

通过反射无法获得Item1,Item2名称通过反射匹配。

您应该在编译器创建的方法上具有TupleElementNames属性。

请参阅此代码:

public class C {
    public (int a, int b) M() {
        return (1, 2);
    }
}

汇编为:

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

您可以使用此代码获得该属性:

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

正如帕特里克(Patrick(所指出的,您可以使用反射来检查方法声明中使用的元组名称。但是,鉴于您的ToStruct方法签名没有显示名称,但这没有任何信息。而且,无论如何,这不会为您提供有关实际将被传递到该方法的元素的信息。

运行时类型仅为ValueTuple(无名称(。这些名称仅在编译时间有助于ItemN的句法糖。


从设计注释中:

在运行时删除名称

重要的是,元组字段名称不是元组运行时表示的一部分,而仅由编译器跟踪。

结果,元组实例的第三方观察者将无法使用字段名称 - 例如反射或动态代码


您可以在http://mustoverride.com/tuples_names/

上了解更多信息。

最新更新