簡體   English   中英

如何將類型作為參數傳遞給方法

[英]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.

該方法必須使用參數類型的原因是因為可能有多種類型,即我可能傳遞給該方法的TableTwoTableThree

關於如何解決這個問題的任何想法?

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

讓我們看一下classTypeT

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 == intclassType == StringBuider嗎? 當然不。 如我所見, classTypeT都應該從TableOne繼承。 讓我們 .net 知道吧:

public static string ComposeHtmlTable<C, T>(IList<T> table) 
  where C : TableOne
  where T : TableOne 
{...}
      

是時候添加一些細節了:

  • 我們不希望IList<T> table作為參數, IEnumerable<T> table就足夠了(我們不僅可以通過數組傳遞列表)
  • 該方法被聲明為public ,任何輸入都是可能的; 所以我們必須驗證輸入 arguments
  • 如果test是空的(即它沒有任何項目?)。 在這種情況下,我們無法獲取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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM