作为面向对象编程语言的初级程序员,我最近接受了C#。我目前正在制作以下网络应用程序:
网页包含几个下拉菜单,这些菜单应该填充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; }
}
}
然后我想执行一个select查询,使用下面显示的代码显示特定集合的每条记录:
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?)"
这显然意味着代码不处理&lt;&gt;之间的“className”符号作为参数中声明的类名...所以这是我的问题。
我首先尝试在参数中使用“class”而不是“Type”,这显然不起作用,因为“class”不是一个类型(显然)。我在堆栈溢出上搜索了一下,并学会了使用typeof来返回类名...这只有在你需要实例化所述类的对象时才有用。遗憾的是,MongoDB无法正常使用类的实例:它需要自己处理类(据我所知)。
以上段落只是为了向您展示我自己做了一些研究,但我对在msdn.com上提供的C#行话有所了解。我正在寻找一个答案,让我明白要做什么才能使这段代码工作,为什么,以及对后者的解释(最好没有我之前提到的msdn.com术语)。
我为长时间的阅读道歉,但我仍然希望有人愿意提供帮助。非常感谢提前。
答案 0 :(得分:2)
你必须使用generics。
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
的类。
这是有效的,因为您可以在需要类型名称的地方使用T
(例如typeof(T)
)。另一方面,当您在代码中使用Type className
参数时,className
只是一个与其他变量一样的变量。 Type
课程不会以任何方式使其变得特别,因此您无法编写typeof(className)
或GetCollection<className>
,因为类型名称是预期的,而不是包含对Type
实例的引用的变量。
此外,作为C#中的约定,接口应以I
开头(即IProduct
),方法名称应为PascalCased。