-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

更传统的方法是创建一个将名称映射到列表对象的字典。您可以在表单加载时填充此字典,然后调用如下内容:

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

当然,您不必手动填充字典:您可以使用反射(如我上面显示的)在运行时填充字典。然后,当您添加新列表时,您不必记住将其添加到字典中。您也可以使用相同的方法来填充组合框。

注意:我并不是说我必须宽恕你正在做的事情作为一个好的设计原则。这并不意味着它不能完成。或者做得很好。或者讲道理。

编辑:我刚刚注意到您通话中的ref(我复制并粘贴了您的代码)。我看不出有任何理由通过引用传递列表。无论如何,如果您从字典中获取它,则不能通过引用传递它——同样,您为什么要通过引用传递?

于 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 回答
-3

你应该能够做到这一点:

private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
{
   ComboBox myCombo = (ComboBox)sender; 
   List<string> myList = new List<string>();
   myList.Add(myCombo.SelectedItem.ToString());
   myFonction(ref myList);    
}
于 2013-10-09T14:26:27.547 回答