2016-06-09 17 views
3

Ich habe zwei Methoden, eine zum Einchecken interner Benutzer und eine andere zum Einchecken externer Benutzer. Die Methode ist bis auf das Objekt identisch (siehe Code). Ich habe mich gefragt, ob es möglich ist, eine Methode zu haben, die beide Objekte akzeptiert. Ich möchte einen Parameter übergeben, der sagt, ob es intern oder extern ist, und basierend darauf möchte ich das entsprechende Objekt aufrufen und speichern. Nicht sicher, ob es möglich ist.Eine Methode, die zwei verschiedene Objekte akzeptiert

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

Was sind 'EventInternal' und' EventExternal'? –

+2

Werfen Sie einen Blick auf Generics. – Tim

+1

Ja, Sie können eine einzige Methode haben, die beide Arten verarbeiten kann. Ihre Parameter wären "Integer und Enum" – MethodMan

Antwort

0

Nicht sagen, dies der beste Weg ist, aber Sie können 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!" }); 
    } 

Aber wie einige Kommentatoren sagen, Interface oder Generics ist die beste Lösung verwenden. Abhängig von Ihrem Szenario.

Verwandte Themen