[英]C# Passing a generic list into method and then casting to type
我有一個方法,使用我需要傳遞給它的列表。
根據我調用此方法的位置,列表的類型不同。
是否可以將列表作為通用列表傳遞,然后將其轉換為某種類型,或者我是否需要為可以使用的每種類型的列表創建參數(見下文)?
public string MyMethod(List<Type1> list1, List<Type2> list2, ...etc )
{
switch(someCondition)
{
case 1:
//pass list1 into a method from class1
break;
case 2:
//pass list2 into a method from class2
break;
...//etc for several more lists
}
而不是使用多個參數制作單個方法,為什么不使用單個List類型創建多個方法? 無論如何,您似乎沒有從一個List類型到另一個類型共享很多代碼。
public string MyMethod(List<int> list)
{
//do something with list
}
public string MyMethod(List<bool> list)
{
//do something with list1
}
...
你可以創建一個接受這樣的泛型類型的泛型函數
public virtual List<T> SelectRecord <T>(int items, IEnumerable<T> list)
{
if (items == -1)
return list.ToList<T>();
else
if (items > list.Count<T>())
return list.ToList<T>();
else
return list.Take<T>(items).ToList<T>();
}
在我的例子中,我將IEnumerable傳遞給我的函數,它返回一個List(我的對象的類型)。 我沒有指定對象的類型。
我希望它有用。
你可以這樣做:
class GenericsExample1Class<T>
{
public string WhatsTheType(List<T> passedList)
{
string passedType = string.Empty;
passedType = passedList.GetType().ToString();
return passedType;
}
}
private void ClienMethod()
{
string typeOfTheList = string.Empty;
// Call Type 1: Value Type
List<int> intergerObjectList = new List<int> { 1, 2 };
typeOfTheList = (new GenericsExample1Class<int>()).WhatsTheType(intergerObjectList);
MessageBox.Show(typeOfTheList);
// Call Type 2: Reference Type
List<string> stringObjectList = new List<string> { "a", "b" };
typeOfTheList = (new GenericsExample1Class<string>()).WhatsTheType(stringObjectList);
MessageBox.Show(typeOfTheList);
// Call Type 2: Complex-Reference Type
List<Employee> complexObjectList = new List<Employee> { (new Employee { Id = 1, Name = "Tathagat" }), (new Employee { Id = 2, Name = "Einstein" }) };
typeOfTheList = (new GenericsExample1Class<Employee>()).WhatsTheType(complexObjectList);
MessageBox.Show(typeOfTheList);
}
感謝所有的答案。
我剛剛發現的另一個解決方案是在C#4.0中使用新功能:
public string MyMethod(List<Type1> list1 = null, List<Type2> list2 = null, ...etc )
{
switch(someCondition)
{
case 1:
//pass list1 into a method from class1
break;
case 2:
//pass list2 into a method from class2
break;
...//etc for several more lists
}
}
然后我可以像這樣調用方法而不必指定所有參數:
MyMethod(list1: mylist1)
是的,這可以通過使用Object類型傳遞參數來輕松完成,如下所示:
public void Test(int SomeCondition,Object Param)
{
dynamic list;
switch (SomeCondition)
{
case 0:
list = (List<int>)Param;
MessageBox.Show(list[0].ToString());
break;
case 1:
list = (List<string>)Param;
MessageBox.Show(list[0].ToString());
break;
default:
MessageBox.Show("Default!");
break;
}
}
你可以這樣調用這個函數:
List<int> list1 = new List<int>(new int[]{1,2,3});
List<string> list2 = new List<string>(new string[] { "one", "two", "three"});
Test(0, list1);
Test(1, list2);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.