2011-08-29 104 views
0

如何獲取通過byref傳入方法的對象的名稱?獲取通過byref參數傳遞的對象的名稱vb.net

例子:

Dim myobject as object 

sub mymethod(byref o as object) 
    debug.print(o.[RealName!!!!]) 
end sub 

sub main() 
    mymethod(myobject) 
    'outputs "myobject" NOT "o" 
end sub 

我使用這個日誌記錄。我多次使用一種方法,並且記錄我傳遞給它的變量的名稱會很好。既然我通過byref,我應該能夠得到這個名字,對吧?

MiniTech移動對於誰提供了答案:

這將使你的參數名稱的方法,它的類型,而不是傳遞按地址變量的名稱。

using system.reflection 

Dim mb As MethodBase = MethodInfo.GetCurrentMethod() 
For Each pi As ParameterInfo In mb.GetParameters() 
    Debug.Print("Parameter: Type={0}, Name={1}", pi.ParameterType, pi.Name) 
Next 

如果你把它放在上面的「mymethod」中,你會得到「o」和「Object」。

回答

3

這是不可能的。變量的名稱不會存儲在IL中,只能是類成員或命名空間類的名稱。通過引用傳遞它絕對不會造成差異。你甚至不能打印出「o」。

此外,爲什麼你會想要這樣做?

+0

它是一個類成員。 –

+0

@Hans Passant:「myobject」?不,這不對。這是一個變量。 – Ryan

+0

用於記錄。這是一個沒有GUI的過程,我試圖不重複代碼。如果我可以獲得變量名稱,那麼對於日誌來說會很好。我只需要將它作爲字符串文字傳遞給我的方法即可。但是「不」也是一個答案。謝謝。 看到我的問題的代碼示例打印「o」(我編輯它)。 – John

1

或者,您可以使用反射來獲取對象的「類型」。

例子:(使用LinqPad執行)

Sub Main  
    Dim myDate As DateTime = DateTime.Now 
    MyMethod(myDate) 

    Dim something As New Something 
    MyMethod(something)  
End Sub 

Public Class Something 
    Public Sub New 
    Me.MyProperty = "Hello" 
    End Sub 
    Public Property MyProperty As String 
End Class 

Sub MyMethod(Byref o As Object) 
    o.GetType().Name.Dump() 
End Sub 
+0

我想他是要求變量名稱,而不是使用的類名稱 – briddums

+0

是的,但作爲替代解決方案,您可以看到類型是否提供可用於登錄的信息。即日期時間進來,然後Int32進來等 – Jeremy

+0

謝謝,這是有幫助的,但我真的在尋找變量名稱。 – John

0

遺憾地說,但是這是你的解決方案。我在方法簽名中留下了(ByVal o As Object),以防您對此有更多的瞭解。

Sub MyMethod(ByVal o As Object, ByVal name As String) 
    Debug.Print(name) 
End Sub 

Sub Main() 
    MyMethod(MyObject, "MyObject") 
End Sub 

另外,您可以創建一個接口,但是這將只允許您使用MyMethod與您設計的類。您可以做更多的工作來改進它,但是如此代碼,您只能在創建時設置RealName

Interface INamedObject 
    Public ReadOnly Property RealName As String 
End Interface 

Class MyClass 
    Implements INamedObject 

    Public Sub New(ByVal RealName As String) 
     _RealName = RealName 
    End Sub 

    Private ReadOnly Property RealName As String Implements INamedObject.RealName 
     Get 
      Return _RealName 
     End Get 
    End Property 
    Private _RealName As String 
End Class 

Module Main 
    Sub MyMethod(ByVal o As INamedObject) 
     Debug.Print(o.RealName) 
    End Sub 

    Sub Main() 
     Dim MyObject As New MyClass("MyObject") 
     MyMethod(MyObject) 
    End Sub 
End Module 
0

如果你的程序仍然是相對,使得它的代碼相同的地方,這可能工作:

' First get the Stack Trace, depth is how far up the calling tree you want to go 
Dim stackTrace As String = Environment.StackTrace 
Dim depth As Integer = 4 

' Next parse out the location of the code 
Dim delim As Char() = {vbCr, vbLf} 
Dim traceLine As String() = stackTrace.Split(delim, StringSplitOptions.RemoveEmptyEntries) 
Dim filePath As String = Regex.Replace(traceLine(depth), "^[^)]+\) in ", "") 
filePath = Regex.Replace(filePath, ":line [0-9]+$", "") 
Dim lineNumber As String = Regex.Replace(traceLine(depth), "^.*:line ", "") 

' Now read the file 
Dim program As String = __.GetStringFromFile(filePath, "") 

' Next parse out the line from the class file 
Dim codeLine As String() = program.Split(delim) 
Dim originLine As String = codeLine(lineNumber * 2 - 2) 

' Now get the name of the method doing the calling, it will be one level shallower 
Dim methodLine As String = Regex.Replace(traceLine(depth - 1), "^ at ", "") 
Dim methodName = Regex.Replace(methodLine, "\(.*\).*$", "") 
methodName = Regex.Replace(methodName, "^.*\.", "") 

' And parse out the variables from the method 
Dim variables As String = Regex.Replace(originLine, "^.*" & methodName & "\(", "") 
variables = Regex.Replace(variables, "\).*$", "") 

您可以控制的深度,這種挖掘與深度參數堆棧跟蹤。 4適用於我的需求。您可能需要使用1 2或3.

相關問題