【问题标题】:C# How to Declare unknown method typesC#如何声明未知方法类型
【发布时间】:2019-04-09 09:24:21
【问题描述】:

我必须向最终用户提供搜索功能,为此我提供了一个下拉列表和一个文本框,下拉列表有 EmployeeID、DisplayName、City 等选项,在选择下拉值后,他需要在文本框中输入一个值.

如果用户选择 EmployeeID,则该值将是 Int 类型,如果他选择 Name 或 City,则该值将是字符串类型。

Public Employee getEmpInfo(object querystring, object queryvalue)
{
// code to get the empplyee info
}

我想知道是否有比使用对象类型更好的方法?

【问题讨论】:

  • 取决于您查询对象的方式,在更简单的场景(查询不同类型的情况几乎相同)中,泛型或重载如下所示会很有用。否则,您可以使用动态 linq 进行查找:stackoverflow.com/questions/9505189/…

标签: c#


【解决方案1】:

你可以像这样重载你的方法:

如果你的参数是 int:

public Employee getEmpInfo(int employeeId){
   // query by ID
}

或者一个字符串

public Employee getEmpInfo(string employeeName){
    // query by name
}

然后如果你给字符串,第二个将被程序使用,否则第一个将是。您都可以在文件中编写这些函数。这称为方法重载

参考资料:

https://www.geeksforgeeks.org/c-sharp-method-overloading/

https://www.tutorialspoint.com/What-is-method-overloading-in-Chash

Function Overloading


另一方面,如果你想使用一个函数来搜索所有类型:

public class SearchParams {
    public int ID;
    public string Name;
    public string City;

    public SearchParams(int ID = null, string Name = null, string City = null)
    { 
         this.ID = ID;
         this.Name = Name;
         this.City = City;    
    }
}


public function getEmpInfo(SearchParams params){
    // build query by that parameters
    if(ID != null){
       // add query by ID
    }
}

【讨论】:

  • 原则上是一个不错的方法,除了有多个不同的string 搜索参数(DisplayName、City)。
  • 那么OP需要为每个查询编写函数或者使用searchParams对象类型在查询内部传递。
  • @PeterB 在下面添加了一个替代答案 ;)
  • 我想使用动态类型也是一种选择(虽然可能不是最好的)
  • @AmirNo-Family 最好在编程中定义事物。然后你就可以看到自己的路了。
【解决方案2】:

可以在 UI 中解决这个问题,方法是为所有属性添加和绑定控件,并根据组合框中选定的属性名称,仅显示选定属性的控件。

这种方法可以对某些属性进行非常具体的控制,而不是强制所有内容都输入字符串。

这应该如何完成取决于 UI 技术(Web、WinForms、WPF、...)

【讨论】:

    【解决方案3】:

    在我看来你的方法是错误的。

    如果您按姓名、ID 或出生日期搜索员工,您将执行完全不同的操作和 SQL 操作。

    您应该为每种可能性都有一个方法版本,以便在每种方法中执行一组特定的操作。

    如果您在 override 中基于参数类型创建单个方法,则当您有相同类型的不同列时,您可能会遇到麻烦。


    这是错误的(甚至无法编译):

    public Employee GetEmployee(int id)
    {
        //Instructions..
    }
    
    public Employee GetEmployee(string name)
    {
        //Instructions..
    }
    
    public Employee GetEmployee(string city)
    {
        //Instructions..
    }
    

    这将支持所有可能性并保持可读性:

    public Employee GetEmployeeByID(int id)
    {
        //Instructions..
    }
    
    public Employee GetEmployeeByName(string name)
    {
        //Instructions..
    }
    
    public Employee GetEmployeeByCity(string city)
    {
        //Instructions..
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-20
      相关资源
      最近更新 更多