我想将一个类作为参数传递。
让我们重温我的问题。 所以我想要做的就是传递一个类,例如:" Customer"一种方法。 我想这样做,因为我也可以通过,例如:"合同"作为同一方法的类。这样我就不需要为每个班级制定一个方法。
旁边信息:我正在使用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次。
我不喜欢复制粘贴,因为代码不正确,当我需要更改它时,这将是很多工作。
所以我想创建一个方法,将我的类作为参数或类似的东西,以便我可以创建一个重用这段代码的泛型方法。
因此,对于我们的例子:
我的(Enitity Framework)课程:
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"))))));
}
}
正如你所看到的,现在我设置了我的课程&#34; Customer&#34;修复了我的代码。 我想用变量或其他东西替换它。
现在我尝试了:
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"))))));
}
这里我得到了编译错误:&#34;无法将lambda表达式转换为类型&#39; Nest.ISearchRequest&#39;因为它不是委托类型。&#34;
我不熟悉代表团及其运作方式,如果可以使用,所以如果代表团是我需要的,请提供足够的详细信息。
我也尝试过:
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"))))));
}
然后它给了我编译错误:&#34;类型或命名空间&#39; myClass&#39;无法找到。&#34;我理解为什么会出现这个错误,所以我知道它会更像public static void Search(..){..}但我不知道如何实现它。
我希望这是对我的问题的更好的解释。
所以它是&#34; Nest&#34;的实施。搜索,我想避免复制粘贴搜索查询。
提前致谢
答案 0 :(得分:2)
我相信你想要做的是使Search
通用
public static classToPass Search<classToPass>()
然后像这样使用它
Test x = Helper.Search<Test>(); //Test = class as definied above
TestTwo y = Helper.Search<TestTwo>();
答案 1 :(得分:1)
使Search
方法通用。泛型参数或多或少是一个类型而不是对象的参数。
答案 2 :(得分:0)
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"))))));
}
}