2013-09-28 3 views
0

У меня есть сценарий, в котором я должен возвращать объекты разных типов в соответствии с условием.Возврат любого типа в C#

Для этого я использовал dynamic тип возврата в C# 4.0.

Но я не мог этого достичь.

public dynamic ValidateUser(string UserName, string Password) 
{ 
    string Result = string.Empty; 

    Employees clsEmployee = new Employees(); 
    Customer clsCustomer = new Customer(); 

    sqlConnection = new SqlConnection(Connection()); 
    command = new SqlCommand("dbo.usp_ValidateUser", sqlConnection); 
    command.CommandType = CommandType.StoredProcedure; 
    command.Parameters.Add("@Username", SqlDbType.VarChar).Value = UserName; 
    command.Parameters.Add("@Password", SqlDbType.VarChar).Value = Password; 
    sqlConnection.Open(); 

    SqlParameter newSqlParam = new SqlParameter(); 
    newSqlParam.ParameterName = "@Result"; 
    newSqlParam.SqlDbType = SqlDbType.NVarChar; 
    newSqlParam.Direction = ParameterDirection.Output; 
    newSqlParam.Size = 50; 
    command.Parameters.Add(newSqlParam); 

    SqlDataReader dr = command.ExecuteReader(); 
    Result = command.Parameters["@Result"].Value.ToString(); 

    if (Result == "Employee") 
    { 
     while (dr.Read()) 
     { 
      clsEmployee.EmployeeId = (int)dr["EmployeeId"]; 
      clsEmployee.EmployeeName = (string)dr["EmployeeName"]; 
      clsEmployee.DepartmentName = (string)dr["DepartmentName"]; 
      clsEmployee.RoleName = (string)dr["RoleName"]; 
     }  
     return clsEmployee; 
    } 
    else if (Result == "Customer") 
    { 
     while (dr.Read()) 
     { 
      clsCustomer.CustomerId = (int)dr["CustomerId"]; 
      clsCustomer.CustomerName = (string)dr["CustomerName"]; 
      clsCustomer.CustomerEmail = (string)dr["CustomerEmail"]; 
      clsCustomer.CustomerMobile = (string)dr["CustomerMobile"]; 
     } 
     return clsCustomer; 
    } 


    //How to return??? 
} 

Когда я пытаюсь вернуться в состоянии он бросает мне

Не все ошибки кода путь возврата значение».

Любые решения?

+3

Почему бы вам не разделить аутентификацию на отдельный класс от населения или хотя бы вернуть «IPerson»? 'dynamic' почти никогда не является правильным решением. –

+1

Вместо того, чтобы иметь последний оператор 'else', просто' return Result; ' –

+6

Я сильно подозреваю, что это не ваш фактический код, иначе вы бы не получили это сообщение об ошибке. Я подозреваю, что ваш последний 'else' на самом деле' else if' или что-то в этом роде. –

ответ

0

Просто удалите else часть:

else if (Result == "Customer") 
{ 
    while (dr.Read()) 
    { 
     clsCustomer.CustomerId = (int)dr["CustomerId"]; 
     clsCustomer.CustomerName = (string)dr["CustomerName"]; 
     clsCustomer.CustomerEmail = (string)dr["CustomerEmail"]; 
     clsCustomer.CustomerMobile = (string)dr["CustomerMobile"]; 
    } 
    return clsCustomer; 
} 
return Result; 
0

Santhosh,

Это не правильный способ для обработки различных типов. Вы могли бы рассмотреть реализацию интерфейса для достижения этого. Это делает более читабельным и гораздо более расширяемым. Я считаю, что вы работаете над кодом поддержки, так что у вас могут быть ограничения для достижения новой реализации.

Я думаю, что вы могли бы изменить, как этот

public object ValidateUser(string UserName, string Password) 
{ 
    object retVal= null; 
    string Result = String.Empty; 

    Employees clsEmployee = new Employees(); 
    Customer clsCustomer = new Customer(); 

    // get the data 
    Result = command.Parameters["@Result"].Value.ToString(); 

    if (Result == "Employee") 
    { 
     while (dr.Read()) 
     { 
      clsEmployee.EmployeeId = (int)dr["EmployeeId"]; 
      clsEmployee.EmployeeName = (string)dr["EmployeeName"]; 
      clsEmployee.DepartmentName = (string)dr["DepartmentName"]; 
      clsEmployee.RoleName = (string)dr["RoleName"]; 
     } 

     retVal=clsEmployee; 
    } 
    if (Result == "Customer") 
    { 
     while (dr.Read()) 
     { 
      clsCustomer.CustomerId = (int)dr["CustomerId"]; 
      clsCustomer.CustomerName = (string)dr["CustomerName"]; 
      clsCustomer.CustomerEmail = (string)dr["CustomerEmail"]; 
      clsCustomer.CustomerMobile = (string)dr["CustomerMobile"]; 
     } 

     retVal=clsCustomer; 
    } 
    retVal=Result; 
    return retVal; 
    } 

Я думаю, что это будет устраняет текущие проблемы.

1
switch (Result) 
{ 
    case "Employee": 
    { 
     ... 
     return ... 
    } 
    case "Customer": 
    { 
     ... 
     return .... 
    } 
    default: 
     return Result; 
} 
Смежные вопросы