我想将一个类作为参数传递。

让我们重提我的问题。
因此,我想做的就是传递一个类,例如:将“客户”传递给方法。
我想这样做,因为这样我也可以将例如“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"))))));

对于契约(Contract):
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"))))));

        }
}

如您所见,现在我在代码中设置了固定的类“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',因为它不是委托(delegate)类型。”

我对委托(delegate)及其工作原理以及是否可以使用它不熟悉,因此如果需要委托(delegate),请向我提供足够的详细信息。

我也尝试过:
    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"))))));

    }

然后,它给了我编译错误:“找不到类型或 namespace '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>();

10-06 13:33
查看更多