-1

私はこのような機能を持っています:

myFonction(ref List<string>myList)

次のように、リスト名を使用してこの関数を動的に呼び出したいと思います。

private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
{
   ComboBox myCombo    =   (ComboBox)sender;    
   myFonction(ref "myList_" +  myCombo.SelectedItem.ToString());    
}

これは C# で可能ですか?

これを簡単に行う方法はありますか?

4

4 に答える 4

2

それはできません。C# はコンパイルされた言語であり、スクリプトではありません。Dictionary<string, List<string>> _Listsリストを指定された順序で保持し、それらを次のような関数に渡すために使用できます

myFunction(ref (from _Lists in _Lists where _List.Key == myCombo.SelectedItem.ToString() select _Lists.Value));

これは最善のアプローチではありませんが、うまくいくはずです。

于 2013-10-09T14:28:57.110 に答える
1

反射を使用できます。たとえば、すべての myList_ 変数がクラスのプライベート インスタンス変数 (このイベント ハンドラーが定義されているフォームなど) である場合、次のようにすることができます。

FieldInfo[] fields = MyForm.GetType().GetFields(
                     BindingFlags.NonPublic | 
                     BindingFlags.Instance);

次に、名前が一致するものを探す必要があります。名前でメンバーを調べる方法もあると思いますが、今は思い出せません。その他のオプションについては、 http://msdn.microsoft.com/en-us/library/System.Type_methods.aspxを参照してください。

より一般的なアプローチは、名前をリスト オブジェクトにマップする Dictionary を作成することです。フォームがロードされたときにこの辞書にデータを入力してから、次のように呼び出すことができます。

myFonction(dictionary["myList_" +  myCombo.SelectedItem.ToString()]);

もちろん、手作業でディクショナリを作成する必要はありません。リフレクション (上で示したように) を使用して、実行時にディクショナリを作成できます。そうすれば、新しいリストを追加するときに、それを辞書に追加することを覚えておく必要はありません。同じ方法を使用して、コンボ ボックスに入力することもできます。

注: 私は、あなたが行っていることを優れた設計原則として必ずしも容認すると言っているわけではありません。それはそれができないという意味ではありません。またはよくやった。または合理的であること。

編集:あなたの呼び出しの参照に気付きました(あなたのコードをコピーして貼り付けました)。リストを参照で渡す理由がわかりません。いずれにせよ、辞書から取得している場合は参照渡しできません。繰り返しますが、なぜ参照渡しなのですか?

于 2013-10-09T14:32:31.717 に答える
0

System.Reflection を使用して動的にパラメーターを指定することにより、メソッドを呼び出すことができます。

例えば:

public class SomeClass
{
    public void myFunction(ref List<string> myList)
    {
    }
}

public class SomeOtherClass
{
    public List<string> list1 { get; set; }
    public List<string> list2 { get; set; }
    public List<string> list3 { get; set; }

    public void DoSomething(int listNumber)
    {
        SomeClass someObject = new SomeClass();

        var parameter = typeof (SomeOtherClass).GetProperty("list" + listNumber).GetValue(this);
        typeof (SomeClass).GetMethod("myFunction").Invoke(someObject, new[] {parameter});
    }
}
于 2013-10-09T14:39:25.273 に答える