如何在C#中的方法中使用类名作为参数?

时间:2015-01-13 18:52:32

标签: c# mongodb class parameters

作为面向对象编程语言的初级程序员,我最近接受了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术语)。

我为长时间的阅读道歉,但我仍然希望有人愿意提供帮助。非常感谢提前。

1 个答案:

答案 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。