[英]c# pass class as a parameter
我想传递一个类作为参数。
所以我想要做的是传递一个类,例如:“客户”到一个方法。 我想这样做是因为我也可以将例如:“Contract”作为类传递给相同的方法。 这样我就不需要为每个类都创建一个方法。
补充信息:我使用的是 EntityFramework 6、MVC 5、Nest 1.0 和 ElasticSearch 1.4
这个概念是我们将东西放在 ElasticSearch 中,然后我们可以进行搜索。 搜索查询是:
SearchElasticClient.Search<Customer>(body => body
.AllIndices()
.Size(500)
.Query(query => query
.Bool(@bool => @bool
.Must(must => must
.QueryString(qs => qs
.Query("XXXX"))))));
对于合同:
SearchElasticClient.Search<Contract>(body => body
.AllIndices()
.Size(500)
.Query(query => query
.Bool(@bool => @bool
.Must(must => must
.QueryString(qs => qs
.Query("XXXX"))))));
如您所见,如果我想对我们拥有的每种类型进行搜索,那么我需要至少复制粘贴此查询 20 次。
我不喜欢复制粘贴,因为代码不正确,当我需要更改它时,这将是很多工作。
所以我想创建一个方法,将我的类作为参数或类似的东西,以便我可以创建一个重用这个代码块的通用方法。
所以对于我们的例子:
我的(实体框架)类:
public class Customer{
public int CustomerID {get;set;}
public String CustomerName {get;set;}
}
public class Contract{
public int ContractID {get;set;}
public String ContractName {get;set;}
}
课程之间的关系对我来说无关紧要,所以我把它们排除在外。
然后在我的 HomeController 中,我想要类似的东西
public class HomeController : Controller
{
...
public ActionResult Search(String textToSearch)
{
//So here you see that I want to use the same method for both classes.
Customer customer = Helpers.SearchHelper.Search(textToSearch);
Contract contract = Helpers.SearchHelper.Search(textToSearch);
}
}
然后我的 SearchHelper 将是这样的:
public static class SearchHelper
{
public static ElasticClient SearchElasticClient
{
get
{
Uri uri = new Uri("http://localhost:9200");
var setting = new ConnectionSettings(uri, "default_INDEX");
return new ElasticClient(setting);
}
}
public static void SearchTest(String textToSearch, MyClass)
{
var test = SearchElasticClient
.Search<Customer>(body => body
.AllIndices()
.Size(500)
.Query(query => query
.Bool(@bool => @bool
.Must(must => must
.QueryString(qs => qs
.Query("XXXX"))))));
}
}
如您所见,现在我在我的代码中设置了我的类“Customer”。 我想用变量或其他东西替换它。
现在我已经尝试过:
public static void SearchTest<T>(String textToSearch)
{
var test = SearchElasticClient
.Search<T>(body => body
.AllIndices()
.Size(500)
.Query(query => query
.Bool(@bool => @bool
.Must(must => must
.QueryString(qs => qs
.Query("XXXX"))))));
}
在这里,我收到编译错误:“无法将 lambda 表达式转换为类型 'Nest.ISearchRequest',因为它不是委托类型。”
我不熟悉委托及其工作原理以及我是否可以使用它,因此如果我需要委托,请提供足够的详细信息。
我也试过:
public static void SearchTest(String textToSearch, Type myClass)
{
var test = SearchElasticClient
.Search<myClass>(body => body
.AllIndices()
.Size(500)
.Query(query => query
.Bool(@bool => @bool
.Must(must => must
.QueryString(qs => qs
.Query("XXXX"))))));
}
然后它给了我编译错误:“找不到类型或命名空间‘myClass’。” 我明白为什么我会收到这个错误,所以我知道它更像是 public static void Search(..){..} 但我不知道如何实现它。
我希望这是对我的问题的更好解释。
所以它是“嵌套”搜索的实现,我想避免复制粘贴搜索查询。
提前致谢
我相信你想做的是让Search
变得通用
public static classToPass Search<classToPass>()
然后像这样使用它
Test x = Helper.Search<Test>(); //Test = class as definied above
TestTwo y = Helper.Search<TestTwo>();
使Search
方法通用。 泛型参数或多或少是一个类型的参数,而不是一个对象。
public static class Helper
{
public static object Search<T>(T classToPass)
{
SearchElasticClient
.Search<T>(body => body
.AllIndices()
.Size(500)
.Query(query => query
.Bool(@bool => @bool
.Must(must => must
.QueryString(qs => qs
.Query("XXX"))))));
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.