簡體   English   中英

如何在C#中的方法中使用類名作為參數?

[英]How do I use class names as parameters in methods in C#?

作為面向對象編程語言的入門程序員,我最近開始學習C#。 我目前正在制作以下Web應用程序:

該網頁由幾個下拉菜單組成,應該使用MongoDB數據庫的結果來填充這些下拉菜單。 在該數據庫中,我有8個集合,每個集合都有一個未知數量的對象,每個對象都有7個屬性(和一個集合名稱)。 我已經為集合之間的所有相似之處使用了一個接口,如下所示:

namespace TestMVC.Models
{
    public interface Product
    {
        string collectionName;
        ObjectId Id { get; set; }
        double Prijs { get; set; }
        string Productlink { get; set; }
        string Productnaam { get; set; }
    }
}

然后我想執行選擇查詢,以使用以下代碼顯示特定集合的每條記錄:

var collection = DatabaseConnect().GetCollection<Product>(collectionName);
var query =
from Product in collection.AsQueryable<Product>()
orderby Product.Prijs
select Product;
foreach (Product prd in query){
    //... Do something
}

這是我的問題開始的地方。 我事先不知道在運行時會檢索到什么集合,因此我試圖用2個參數制作一個泛型函數,該參數將處理數據庫中所有8種類型的集合。

public string databaseResult(string collectionName, Type className)

我稱它為:

databaseResult('motherboards', typeof(Motherboards));

因此,當我將所有這些注入上述代碼中時,我在下一行中得到一個錯誤

var collection = DatabaseConnect().GetCollection<className>(collectionName);

他說:

"The type or namespace name "className" could not be found (are you missing a using directive or an assembly reference?)"

顯然這意味着代碼沒有將<>符號之間的“ className”視為參數中聲明的類名稱。因此,這就是我的問題。

我首先嘗試在參數中使用“類”而不是“類型”,這顯然是行不通的,因為“類”不是類型(顯然)。 我在堆棧溢出中進行了一些搜索,並學會了使用typeof返回類名...僅在您需要實例化所述類的對象時才有用。 不幸的是,MongoDB無法與類實例一起正常工作:據我所知,它需要與類本身一起工作。

上面的段落只是向您顯示我已經做過一些研究,但是我對理解msdn.com上呈現的C#術語感到茫然。 我正在尋找一個答案,它將使我理解為使此代碼有效而應執行的操作,以及為什么以及對后者的解釋(最好沒有前面提到的msdn.com術語)。

我為閱讀本書深表歉意,但我仍然希望有人願意提供幫助。 提前謝謝了。

您必須為此使用泛型

public string DatabaseResult<T>(string collectionName)
    where T : IProduct
{
    var collection = DatabaseConnect().GetCollection<T>(collectionName);
    // ...
}

您可以這樣稱呼:

DatabaseResult<Motherboard>("motherboards");

在此示例中, T是類型的占位符。 它被Motherboard替代。

注意where T : IProduct子句。 它對T設置了約束,以僅允許實現IProduct類。

之所以typeof(T)是因為您可以在需要輸入類型名稱的地方使用T (例如typeof(T) )。 另一方面,當在代碼中使用Type className參數時, className就像其他變量一樣。 Type類不會以任何方式使其特殊,因此您不能例如編寫typeof(className)GetCollection<className> ,因為在那里需要類型名 ,而不是包含對Type實例的引用的變量。

另外,按照C#的約定,接口應以I (即IProductIProduct ,方法名稱應為PascalCased。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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