簡體   English   中英

使用反射從父類獲取自己的屬性名稱

[英]Get own property name from parent class using reflection

是否可以獲取當前類在其調用的類中分配的屬性名稱?

假設我有三節課:

class Parent1
{
   public Child myName;

   public void Foo()
   {
      myName.Method();
   }
}

class Parent2
{
   public Child mySecondName;

   public void Foo()
   {
      mySecondName.Method();
   }
}

class Child
{
   public void Method()
   {
      Log(__propertyName__);
   }
}

我想LogmyName時, Method是從所謂的Parent1mySecondName如果Method是從所謂的Parent2

是否可以使用反射而不是通過參數中的字符串傳遞名稱(我只想將其用於調試目的,我不想以任何方式將這些類鏈接在一起)

使用StackTrace您至少可以獲取進行調用的方法和類:

System.Diagnostics.StackTrace trace = new System.Diagnostics.StackTrace();
Type calledFromType = trace.GetFrame(1).GetMethod().ReflectedType;

這應該給你Parent1類型。

我認為沒有辦法獲取調用該方法的變量的名稱。

您當然可以枚舉calledFromType所有字段和屬性,並查看其中一個是否屬於Child類型,但是您無法保證在調用時實際使用了字段或屬性。

由於各種原因,使用反射沒有現實的方法來做到這一點:

  1. 您的實例狀態中沒有任何內容與特定的“所有者”相關。

  2. 您可以從有權訪問該屬性的任何地方調用您的代碼,因此堆棧跟蹤將無法可靠地返回任何有用的內容。

  3. 對類實例的引用可以存儲在任意數量的位置,包括方法調用的變量和參數。

所以基本上沒有。 你能做的最好的事情是告訴它它在哪里,即使這樣,你也會違反參考文獻。

class Child
    {
        public void Method()
        {
            StackFrame sf = new StackFrame(1);
            var type = sf.GetMethod().ReflectedType;

            var field = type.GetFields().FirstOrDefault(i => i.FieldType == typeof(Child));

            Log(field.Name);
        }
    }

暫無
暫無

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

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