簡體   English   中英

反思:從PropertyInfo獲取FieldInfo

[英]Reflection: Get FieldInfo from PropertyInfo

我正在使用Reflection進行一些動態代碼生成,並且我遇到了一種情況,我需要獲取屬性的支持字段(如果有的話)才能使用它的FieldInfo對象。

現在,我知道你可以使用

.IsDefined(typeof(CompilerGeneratedAttribute), false);

在FieldInfo上發現它是否是自動生成的,所以我假設屬性類似於自動生成字段?

干杯,艾德

屬性的get_set_方法也會應用CompilerGeneratedAttributed 雖然通過屬性沒有強耦合,但是有一個命名約定用於auto屬性的支持字段:

public string Foo { get; set;}

生成一個private string <Foo>k__BackingField成員( <>這里是名稱的一部分,因為它們在IL中合法但在C#中不合法;它們與泛型無關)。

例如,這將獲得一個類中所有自動屬性的列表,以及它們的支持字段:

t.GetProperties().Where(p => 
    (p.GetGetMethod() ?? p.GetSetMethod()).IsDefined(typeof(CompilerGeneratedAttribute), false))
   .Select(p => new 
   { 
      Property = p, 
      Field = t.GetField(string.Format("<{0}>k__BackingField", p.Name),
          System.Reflection.BindingFlags.NonPublic | 
          System.Reflection.BindingFlags.Instance) 
   });

沒有內置的方法來執行此操作,因為屬性的存在不一定保證存在后備字段。

我發現這篇文章解釋了一種做法。 它涉及獲取屬性的setter的IL並解析它以查找正在設置的字段的證據。

安德魯是對的。

實際上,屬性只是方法的“指針”,通常是由Visual Studio或其他高級語言(大多數時候)生成的getter / setter。

但是,解析二傳手並不容易。 而且,由於內部setter只是另一種vanilla方法,它們可以使用多個字段,或者根本不使用,甚至可以調用其他方法。 也許您可以為常見方案提供解決方案,但您必須解析IL字節碼。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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