0

次の変数があるとします。

Public Shared x As String = "100"
Public Shared y As String = "text"
Public Shared z As String = "something"

そして、私は関数を得ました:

Function giveVar(ByVal varName As String) As String 

    Return varName
End Function

しかし、これは当然、私が望むことをしません。私が欲しいのは、私の関数giveVarが を保持する変数の値を返すことですgiveVar。たとえば、giveVar("x")I want my function to returnを呼び出します"100"

もちろん、これは誰でもできますが、Select Caseそれは私がやりたいことではありません。誰か提案はありますか?文字列に基づいて値を呼び出すことさえ可能ですか?

[編集:]

Namespace i18n
    public NotInheritable Class Settings
        Public Shared LanguageCode As String
        Public Shared HideAllLocalizedText As Boolean
    End Class

Public NotInheritable Class i18n
        Private Sub New()

        End Sub

        Public Shared Function t(ByVal varName As String) As String
            Select Case Settings.LanguageCode
                Case "en"
                    Return en(varName)
                Case Else
                    Return nl(varName)
            End Select
        End Function

        Private Shared Function en(ByVal varName As String) As String
            Dim ASP_0344 As String = "Cancel"
            Dim ASP_0807 As String = "Click"
            Dim ASP_0808 As String = "here"
            Dim ASP_0812 As String = "Welcome at the login screen..."

            ' These are examples there is a whole bigger list               

            Return CallByName(Me, varName, vbGet)
        End Function

        Private Shared Function nl(ByVal varName As String) As String
            Dim ASP_0344 As String = "Annuleren"
            Dim ASP_0807 As String = "Klik"
            Dim ASP_0808 As String = "hier"
            Dim ASP_0812 As String = "Welkom op het inlogscherm..."

            Return CallByName(Me, varName, vbGet)
        End Function

    End Class
End Namespace

これはこれまでのところうまくいくと思いますが、で次のエラーが発生しCallByName(Me, varName, vbGet)ますMe"me is only valid within an instance method"

4

5 に答える 5

3

あなたが求めているものの最も単純な実装はDictionaryかもしれません。

// c#
var values = new Dictionary<string, string>();
values["x"] = "100";
values["y"] = "text";
values["z"] = "something";

public string GiveVar( string name )
{
   return values[name];
}
'vb.net
Dim values As New Dictionary(Of String, String)
values.Add("x", "100")
values.Add("y", "text")
values.Add("z", "something")

Function giveVar(ByVal varName As String) As String 
    Return values(varName)
End Function

この時点では、値を取得するための関数は実際には必要ありません。ディクショナリでインデクサーを使用するだけです。

メンバーの名前が実行時までわからない場合は、代わりにリフレクションを使用できます。リフレクションは (場合によってはかなりの) パフォーマンス ヒットをもたらし、壊れやすい/非直感的なコードにつながる可能性がありますが、正しく使用すれば強力なツールです。

Expando オブジェクトを使用して同様のコードを作成することもできます。通常、expando オブジェクトを使用してあまり構造化されていないデータを改善する場合を除き、これは正しい方法ではありません。

于 2012-04-12T08:28:05.167 に答える
2

はい、リフレクションを使用して実行できます。

Imports System.Reflection

Public Class Test

  Public Shared x As String = "100"
  Public Shared y As String = "text"
  Public Shared z As String = "something"

  Function giveVar(ByVal varName As String) As String

    Dim pi As FieldInfo = Me.GetType().GetField(varName)

    Return (pi.GetValue(Me)).ToString()

  End Function

End Class

それをテストするには:

Module Module1

  Sub Main()

    Dim t As New Test

    Console.WriteLine("x: " & t.giveVar("x"))
    Console.WriteLine("y: " & t.giveVar("y"))
    Console.WriteLine("z: " & t.giveVar("z"))

    Console.ReadKey()

  End Sub

End Module

これを機能させるには System.Reflection 名前空間をインポートする必要があります。また、giveVar() 関数が定義されているクラスで変数を定義する必要があります。それ以外の場合は、変数を所有するオブジェクトをパラメーターとして渡し、 Me.GetType() 呼び出しを置き換えます。

最後に、これはローカル変数では機能しません。

于 2012-04-12T08:35:09.937 に答える
1

試す

CallByName (Me, "x", VbGet)
于 2012-04-12T08:35:55.910 に答える
0

文字列を a に入れるHashtableと、キーで簡単に取得できます。ハードコーディングされたキーを使用して検索するパブリック プロパティを引き続き使用できます。

于 2012-04-12T08:28:01.050 に答える
0

一般的なソリューションはどうですか

C#で

using System.Reflection;

public class MyClass
{
    public static string x = "1";
    public static int y = 2;

    public static bool TryGetValue<T>(string variableName, out T value)
    {
        try
        {
            var myType = typeof(MyClass);
            var fieldInfo = myType.GetField(variableName);
            value = (T)fieldInfo.GetValue(myType);
            return true;
        }
        catch
        {
            value = default(T);
            return false;
        }
    }
}

あなたはこのように使うことができます

string xValue;
if (MyClass.TryGetValue("x", xValue))
{
    // it worked
}
else
{
    // oops, x is not there or it will not cast to string
}

int yValue;
if (MyClass.TryGetValue("y", yValue))
{
    // it worked
}
else
{
    // oops, x is not there or it will not cast to int
}

しかし、覚えておいてください

string valueX = MyClass.x;
int valueY = MyClass.y;

コードが短くなり、コンパイル時に型チェックが行われます。

于 2012-04-12T09:03:41.123 に答える