我有这样的功能:
myFonction(ref List<string>myList)
我想动态地使用列表名称调用此函数,如下所示:
private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
{
ComboBox myCombo = (ComboBox)sender;
myFonction(ref "myList_" + myCombo.SelectedItem.ToString());
}
C#可以实现吗?
有没有办法做到这一点呢?
答案 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);
}