[英]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.