簡體   English   中英

我無法通過 c# 7.0 中的反射從 valuetuple 獲取參數名稱

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM