我想使用反射映射一个值。文档说,有一个带有参数名称(其他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/