簡體   English   中英

我如何獲得一個類名變量

[英]how do i get a class name variable

我正在嘗試獲取類變量名稱

static void Main()
{
    TaskAction m_first = new TaskAction();
    m_first.Increment();
    m_first.Increment();

    TaskAction m_Second = new TaskAction();
    m_Second.Increment();

}

public class TaskAction
{
    private int m_Current;

    public TaskAction()
    {
        m_Current = 0;

    }

    public void Increment()
    {
        m_Current++;
        write(" TaskAction " + vairableName + " "  + m_Current);       
    }
}

我想寫出來:

TaskAction m_first 1

TaskAction m_first 2

TaskAction m_second 1

像這樣檢索有關程序的元數據既復雜又不必要,只需將名稱傳遞給構造函數即可。

static void Main()
{
    TaskAction m_first = new TaskAction("m_first");
    m_first.Increment();
    m_first.Increment();

    TaskAction m_Second = new TaskAction("m_Second");
    m_Second.Increment();

}

public class TaskAction
{
    private int m_Current;
    private string m_taskName;

    public TaskAction(string taskName)
    {
        m_taskName = taskName;
        m_Current = 0;
    }

    public void Increment()
    {
        m_Current++;
        write(" TaskAction " + m_taskName + " "  + m_Current);       
    }
}

簡短的回答:不能。

長答案:

從技術上講,可以通過檢查IL(由C#編譯器創建的中間語言)來確定變量名,但是此操作很困難且容易出錯。 此外,您忽略了一些重要的問題:

  • 首先,正如這里已經問過的: 為什么? 這樣的事情將如何改善您的程序?

  • 類的每個實例都可以有(見我的關於.NET類型的答案多個變量指向它在這里 )。 您想得到哪一個? 例如,考慮以下程序:

var v1 = new TaskAction();
var c2 = new TaskAction();
c1.Increment(); // 1 c1
c2 = c1;
c2.Increment(); // 2 c1? 2 c2? 2 c1 c2?
  • 這樣一來,您將以一種困難的方式破壞封裝-任何反射都會破壞封裝,除非您確實需要,否則實際上不使用它-這么多嗎? 反射破壞有關專用接口的隱藏信息,您要破壞內部接口!

由於您沒有提供足夠的信息,所以我不知道您為什么要這么做。 但是這里有一些解決方案:

  • 例如,如果要使用類別進行日志記錄-只需將類別傳遞給構造函數即可,如上文所述。

  • 如果你想知道的變量是哪種類型的-使用它的名字是非常非常非常糟糕的做法,即使你有約定-利用多態性,而不是(最好的),或者,至少,有檢查類型is / as ,例如:

if (this is Drived)
{
    ((Drived)this).SomeDrivedMethod();
}

請注意,這違反了OOP原則:類不應了解其驅動類。

希望這對您有所幫助。 祝你今天愉快!

編輯:

為了您的目的,您可以執行以下任一操作:

最好-調試代碼,查看調用堆棧等。

更糟-打印調用方方法名稱,而不是對象名稱。 可以使用System.Runtime.CompilerServices.CallerMemberNameAttribute來完成:

void Increment([System.Runtime.CompilerServices.CallerMemberName] string caller = null)
{
    // Default value to `caller` is neccessary
    // ...
    Console.WriteLine("Caller: {0}", caller);
}

注意:編譯器將填充caller參數,而不是在運行時填充。

如果要唯一標識類對象或使用自定義構造函數為類提供名稱,請​​獲取object.GetHashCode()。

暫無
暫無

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

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