2016-06-09 4 views
3

У меня есть два метода: один для регистрации внутренних пользователей и другой для регистрации внешних пользователей. Метод тот же, за исключением объекта (см. Код). Мне было интересно, возможно ли иметь один метод, который бы принял оба объекта. Я хочу передать параметр, который говорит, если он является внутренним или внешним, и на основе этого я хочу вызвать соответствующий объект и сохранить его. Не уверен, что это возможно.Один метод, принимающий два разных объекта

public JsonResult CheckInInternal(int ID) 
{ 
    var e = EventInternal.Get(ID, EventInternal.FetchType.ID); 

    if (e.ID == 0) 
    { 
     throw new Exception("Registration ID not found."); 
    } 
    if (DateTime.Now.Date > e.EventDetail.StartTime.Date) 
    { 
     throw new Exception("Check-in has been closed for this class!"); 
    } 
    e.CheckedIn = true; 
    e.Save(); 
    return Json(new { success = true, message = "Success!" }); 
} 

public JsonResult CheckInExternal(int ID) 
{ 
    var e = EventExternal.Get(ID, EventExternal.FetchType.ID); 

    if (e.ID == 0) 
    { 
     throw new Exception("Registration ID not found."); 
    } 
    if (DateTime.Now.Date > e.EventDetail.StartTime.Date) 
    { 
     throw new Exception("Check-in has been closed for this class!"); 
    } 
    e.CheckedIn = true; 
    e.Save(); 
    return Json(new { success = true, message = "Success!" }); 
} 
+0

Что такое 'EventInternal' и' EventExternal'? –

+2

Взгляните на Generics. – Tim

+1

да, у вас может быть один метод, который может обрабатывать оба типа. Вашими параметрами были бы «Integer и Enum» – MethodMan

ответ

0

Не говорю, что это лучший способ, но вы можете использовать Reflection

public enum CallType 
{ 
Internal, External 
} 
public JsonResult CheckInInternalOrExternal(int ID, CallType type) 
    { 
     object e = type == CallType.Internal? EventInternal.Get(ID, EventInternal.FetchType.ID) as object : EventExternal.Get(ID, EventExternal.FetchType.ID) as object; 

     var idProperty = e.GetType().GetProperty("ID"); 
     var idValue = Convert.ToInt32(IdProperty.GetValue(e)); 

     if (idValue == 0) 
      { 
       throw new Exception("Registration ID not found."); 
      } 
     if (DateTime.Now.Date > e.EventDetail.StartTime.Date) 
      { 
       throw new Exception("Check-in has been closed for this class!"); 
      } 

     var checkedInProperty = e.GetType().GetProperty("CheckedIn"); 
     checkedInProperty.SetValue(e, true); 

     var saveMethod = e.GetType().GetMethod("Save"); 
     saveMethod.Invoke(e); 

     return Json(new { success = true, message = "Success!" }); 
    } 

Но некоторые комментаторы говорят, Interface или Generics является лучшим решением. В зависимости от вашего сценария.

Смежные вопросы