繁体   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