2009-07-06 1 views
1

Ich möchte wissen, ob es möglich ist, den Variablennamen abzurufen, wenn es in eine bestimmte Funktion übergeben wurde. Zum Beispiel, wenn ich parseId(myId) zu einer Funktion mit der Signatur parseId(id) aufrufen, kann ich offensichtlich den Wert von 'ID' abrufen. Gibt es jedoch eine Möglichkeit, 'MyId' als Zeichenfolge abzurufen (ohne es als einen anderen Wert übergeben)?Ist es möglich, den Namen einer Variablen zusammen mit dem Wert zu übergeben, wenn Sie Funktionen durchlaufen?

Speziell in vb.net, aber ich bin daran interessiert, wie es in einer beliebigen Sprache funktionieren würde.

+0

Re Ihren Kommentar (.NET 2.0) - in diesem Fall wird die Antwort viel einfacher ... "Nein". –

+0

Unglücklich! Vielen Dank :) – Chris

Antwort

1

Das ist alles nur zufällige Gedanken .. fühlen Sie sich frei zu entlassen oder nicht ;-P

Kommentieren Sie Ihren Kommentar über die Verwendung mit gespeicherten Prozeduren ... Wenn Sie diese Route gehen möchten, würde ich nicht mit den lokalen Variablennamen herumspielen; Das ist ein Implementierungsdetail. Sie konnten jedoch diese Angaben auf einem Interface Verfahren aussetzen und die Namen von dort verwenden, da diese mehr formalisiert ist - zum Beispiel (C#):

interface ICustomerRepository { 
    Customer GetById(int id); // perhaps an attribute to name the sproc 
} 

Dieses und ähnlichen Ausdrucksbaum verwenden Parsen (as discussed here) zu erhalten der Name und Wert des Parameters, zum Beispiel:

var repoWrapper = new Repo<ICustomerRepository>(); 
int custId = 12345; 
var cust = repoWrapper.Execute(r => r.GetById(custId)); 

Hier würden wir wollen 12345 das Argument GetById als „id“ (nicht „custId“), mit dem Wert zu lösen. Dies ist eigentlich genau das, was meine protobuf-net RPC code tut; - p (fragen Sie mich einfach nicht, es in VB zu übersetzen - es ist schwer genug, es in einer Sprache zu schreiben, die Sie gut kennen ...)

1

Nein, das ist im normalen Sinne nicht möglich. Was versuchst du wirklich damit zu erreichen?

+0

Ich spiele mit einigen Möglichkeiten. Ein Beispiel ist eine Funktion, die das Übergeben von Parametern an eine gespeicherte Prozedur erleichtert. Eine Funktion würde eine Warteschlange aller Parameter und des Namens der gespeicherten Prozedur nehmen. Variablen würden mit der gleichen Namenskonvention wie in der gespeicherten Prozedur selbst benannt werden. Diese Funktion würde die Werte in der Warteschlange analysieren und die Prozedur, die aufgerufen werden soll, im Wesentlichen "laden". Ein bisschen frivol, ja. Ich erkunde nur Möglichkeiten :) – Chris

+0

@Chris: Experiment: Klicken Sie mit der rechten Maustaste auf Ihr Projekt. Add-> Component.Verwenden Sie den Server-Explorer, und ziehen Sie die gespeicherte Prozedur auf die Entwurfsoberfläche. Es sollte einen SqlCommand mit der konfigurierten Parameters-Sammlung erstellen. Keine Anpassung der Variablennamen der Programmiersprache an die Namen von Datenbankparametern. –

+0

@John: Richtig. Ich kann es schon jetzt so machen. Ich suche nur etwas Neues zu lernen :) Ich habe bereits Teile in eine andere Funktion eingefügt, um Wiederholungen zu vermeiden, aber es scheint immer noch ziemlich viel davon zu geben. – Chris

1

Sie können dies in .NET 3.5 und höher unter Verwendung von Ausdrucksbäumen tun; Ich werde ein C# Beispiel klopfen, und versuchen Sie es für VB durch Reflektor zu laufen ...

C#:

static void Main() 
{ 
    int i = 17; 
    WriteLine(() => i); 
} 
static void WriteLine<T>(Expression<Func<T>> expression) 
{ 
    string name; 
    switch (expression.Body.NodeType) 
    { 
     case ExpressionType.MemberAccess: 
      name = ((MemberExpression)expression.Body).Member.Name; 
      break; 
     default: 
      throw new NotSupportedException("Give me a chance!"); 
    } 
    T val = expression.Compile()(); 
    Console.WriteLine(name + "=" + val); 
} 

Die VB ist unten, aber beachten Sie, dass der VB-Compiler scheint verwenden verschiedene Namen (wie $VB$Local_i, nicht i):

Sub Main() 
    Dim i As Integer = 17 
    WriteLine(Function() i) 
End Sub 

Private Sub WriteLine(Of T)(ByVal expression As Expression(Of Func(Of T))) 
    If (expression.Body.NodeType <> ExpressionType.MemberAccess) Then 
     Throw New NotSupportedException("Give me a chance!") 
    End If 
    Console.WriteLine((DirectCast(expression.Body, MemberExpression).Member.Name 
     & "=" & Convert.ToString(expression.Compile.Invoke))) 
End Sub 
+0

Das sieht nach einer wirklich interessanten Lösung aus. Ich verwende jedoch .net 2.0 – Chris

Verwandte Themen