[英]How to pass Type as a Parameter to Method
我是 C# 的新手,但是在嘗試將TableOne
類型 class 傳遞給方法並在方法本身中使用時遇到了問題。
Class:
public class TableOne
{
public List<string> CaseID { get; set; }
public List<string> Owner { get; set; }
public List<string> Assignee { get; set; }
public List<string> Comments { get; set; }
}
方法:
public static string ComposeHtmlTable<T>(Type classType, IList<T> table)
{
List<classType> test = table.Cast<classType>().ToList();
Console.WriteLine(test[0].CaseID[0]); // trying to access data
return "test";
}
如何調用該方法:
ComposeHtmlTable<TableOne>(typeof(TableOne), data.TableOne);
我收到錯誤:
'classType' is a variable but is used like a type.
該方法必須使用參數類型的原因是因為可能有多種類型,即我可能傳遞給該方法的TableTwo
或TableThree
。
關於如何解決這個問題的任何想法?
TIA
問題出在這行代碼List<classType> test = table.Cast<classType>().ToList();
List<classType>
和Cast<classType>
是無效的語法。 List<T>
是可以接受的。
c# 中的 arguments 類型分別發送到變量。 您已經將類型參數 T 提供給泛型方法。 所以請改用List<T>
和Cast<T>
。
因此,將 classType 作為變量傳入是多余的。
即使您需要對提供的元素類型進行 switch 表達式,您也可以打開typeof(T)
正如@Dai 建議的那樣,您可以用泛型類型參數替換classType
參數:
static List<T1> ComposeHtmlTable<T1,T2>(IList<T2> table)
{
List<T1> test = table.Cast<T1>().ToList();
return test;
}
PS:我更改了您的方法以返回新列表,因為我認為這就是您想要實現的目標...
並稱它為:
ComposeHtmlTable<TableOne,TableOne>(data.TableOne);
如果這兩種泛型類型總是相同的,您可以將該方法簡化為:
static List<T> ComposeHtmlTable<T>(IList<T> table)
{
return (List<T>) table.Cast<T>().ToList();
}
並稱之為:
ComposeHtmlTable<TableOne>(data.TableOne);
讓我們看一下classType
和T
:
public static string ComposeHtmlTable<T>(Type classType, IList<T> table)
{
List<classType> test = table.Cast<classType>().ToList();
Console.WriteLine(test[0].CaseID[0]); // trying to access data
return "test";
}
它們可以是一些任意類型,比如T == int
和classType == StringBuider
嗎? 當然不。 如我所見, classType
和T
都應該從TableOne
繼承。 讓我們 .net 知道吧:
public static string ComposeHtmlTable<C, T>(IList<T> table)
where C : TableOne
where T : TableOne
{...}
是時候添加一些細節了:
IList<T> table
作為參數, IEnumerable<T> table
就足夠了(我們不僅可以通過數組傳遞列表)public
,任何輸入都是可能的; 所以我們必須驗證輸入 argumentstest
是空的(即它沒有任何項目?)。 在這種情況下,我們無法獲取test[0].CaseID[0]
。public static string ComposeHtmlTable<C, T>(IEnumerable<T> table)
where C : TableOne
where T : TableOne
{
if (table is null)
throw new ArgumentNullException(nameof(table));
List<C> test = table.Cast<C>().ToList();
if (test.Count > 0 && test[0] != null && test[0].CaseID.Count > 0)
Console.WriteLine(test[0].CaseID[0]); // trying to access data
else
Console.WriteLine("test is empty");
return "test";
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.