将变量名动态传递给函数

时间:2013-10-09 14:17:28

标签: c# .net winforms variables reflection

我有这样的功能:

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 个答案:

答案 0 :(得分:2)

你不能这样做,C#是编译语言,而不是脚本。 您可以使用Dictionary<string, List<string>> _Lists按给定顺序保留列表,并将其传递给

之类的功能
myFunction(ref (from _Lists in _Lists where _List.Key == myCombo.SelectedItem.ToString() select _Lists.Value));

这不是最好的方法,但应该有效。

答案 1 :(得分:1)

您可以使用反射。例如,如果所有myList_变量都是类的私有实例变量(比如定义了这个偶数处理程序的Form),那么你可以这样做:

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()]);

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

注意:我并不是说我必须宽恕你正在做的一个好的设计原则。这并不意味着它无法完成。或者做得很好。或者是合理的。

编辑:我刚刚注意到你的电话中的参考(我复制并粘贴了你的代码)。我看不出有任何理由通过引用传递列表。在任何情况下,如果从字典中获取它,则不能通过引用传递它 - 再次,为什么要通过引用传递?

答案 2 :(得分:0)

您可以通过使用System.Reflection动态提供其参数来调用您的方法。

ForExample:

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});
    }
}

答案 3 :(得分:-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);    
}