[英]How do I create a dynamic class with variable name of type 'toString'?
[英]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.