[英]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
(即IProduct
) IProduct
,方法名稱應為PascalCased。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.