[英]How can I get the compiler aliases of ValueTuple field names for reflection
[英]I can't get parameter names from valuetuple via reflection in c# 7.0
我想使用反射將 ValueTuple 映射到一個類。 文檔說有一個屬性附加到 ValueTuple 帶有參數名稱(除了 Item1、Item2 等...),但我看不到任何屬性。
拆機什么也看不到。
發生什么事?
例子:
public static T ToStruct<T, T1,T2>(this ValueTuple<T1,T2> tuple) where T : struct
通過反射無法通過反射獲取 Item1、Item2 名稱以與 T 字段匹配。
您應該在編譯器創建的方法上具有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;
正如帕特里克在上面指出的,您可以使用反射來檢查方法聲明中使用的元組名稱。 但是,鑒於您的ToStruct
方法簽名沒有顯示名稱,因此不會為您提供任何信息。 而且,無論如何,這不會為您提供有關將實際傳遞給該方法的元組的信息。
運行時類型僅為ValueTuple
(無名稱)。 這些名稱僅在編譯時ItemN
,作為ItemN
語法糖。
從設計說明:
重要的是,元組字段名稱不是元組運行時表示的一部分,而是僅由編譯器跟蹤。
因此,元組實例的第 3 方觀察者將無法使用字段名稱 - 例如反射或動態代碼。
您可以在http://mustoverride.com/tuples_names/閱讀更多相關信息
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.