c#传递类作为参数

时间:2015-02-11 15:24:08

标签: c# lambda elasticsearch asp.net-mvc-5 nest

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

让我们重温我的问题。 所以我想要做的就是传递一个类,例如:" 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;的实施。搜索,我想避免复制粘贴搜索查询。

提前致谢

3 个答案:

答案 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"))))));

    }
}