Ich arbeite mit .net 1.1 und VS 2003, daher keine coolen Sprachfeatures hier 😕
Anbei habe ich mal zwei Beispielmethoden, die bereits relativ generisch sind:
protected void GenericComboBoxMethodHandler(ComboBox cbox, TextBox tbox , FuncDelegateUint funct)
{
int i = cbox.SelectedIndex;
if( i > -1)
{
try
{
setOutputStatus(tbox, Result.RUNNING);
this.Refresh();
Magic tpd = new Magic();
if( funct( tpd, (uint)i) )
{
setOutputStatus(tbox, Result.FINISHED);
}
else
{
setOutputStatus(tbox, Result.FAILED);
}
return;
}
catch(Exception e)
{
MessageBox.Show(this, "Exception occured: "+e.Message,"Exception occured during progress",MessageBoxButtons.OK, MessageBoxIcon.Stop);
}
}
// Fallback if exception or index out of range
setOutputStatus(tbox, Result.NOT_SELECTED);
}
protected void GenericVoidMethodHandler(TextBox tbox ,FuncDelegateVoid funct)
{
try
{
setOutputStatus(tbox, Result.RUNNING);
this.Refresh();
Magic tpd = new Magic();
if( funct( tpd) )
{
setOutputStatus(tbox, Result.FINISHED);
}
else
{
setOutputStatus(tbox, Result.FAILED);
}
return;
}
catch(Exception e)
{
MessageBox.Show(this, "Exception occured: "+e.Message,"Exception occured during progress",MessageBoxButtons.OK, MessageBoxIcon.Stop);
}
}
Alles im try-catch block ist nahezu gleich, bis auf den delegaten aufruf, bei dem einen hat er parameter und bei dem anderen nicht.
Dennoch gefällt mir die Redundanz hier nicht, aber mir fällt kein Weg ein, wie ich den delagaten so generalisieren kann, dass ich beliebige Methoden aufrufen kann.
Ich versuche also im Moment func(x, uint) und func(x) gleich zu behandeln, es kann sein, dass dann noch func(x, uint, string) dazu kommt usw
Life is a short
Du könntest als Parametertyp System.Object nehmen und für einen parameterlosen Aufruf könntest du dann Type.Missing reingeben und nach diesem Wert im Delegate fragen.
> Codejunky <
Guck Dir mal das Pattern "Template Method" an ... das könnte Dir ein paar Ideen liefern 😉.
Ansonsten: Option-Objekt ist eine Variante. Siehe http://langexplr.blogspot.com/2008/06/using-f-option-types-in-c.html
Wissensvermittler und Technologieberater
für .NET, Codequalität und agile Methoden
Es gibt ja unter umständen eine variable Anzahl an Parametern UND deren weren, die ich durchreichen müsste. Ich bin nicht sicher, wie das klappen soll.
Wie kann eine template Methode denn wissen, wieviele Parameter die an den delegaten übergeben soll?
Ich muss theoretisch ja die Try catch geschichte auslagern:
void genericMethod<...>( X )
{
try
{
setOutputStatus(tbox, Result.RUNNING);
this.Refresh();
Magic tpd = new Magic();
if( X )
{
setOutputStatus(tbox, Result.FINISHED);
}
else
{
setOutputStatus(tbox, Result.FAILED);
}
return;
}
catch(Exception e)
{
MessageBox.Show(this, "Exception occured: "+e.Message,"Exception occured during progress",MessageBoxButtons.OK, MessageBoxIcon.Stop);
}
Da happerts bei mir. Ich muss die Methode ja nicht mit mit string, unsigned oder void instantiieren sondern eigentlich schon mit dem Aufruf der Methode, weil die generische Methode ja nicht weiß, ob sie func(x, wert1), oder func(x, wert2), oder func(x, wert1,wert2) aufrufen muss. Das wissen ja nur aufrufenden Methoden, nur das der Methoden aufruf halt "verzögert" werden muss, bis er in dem try catch drin ist und ne Instanz von Magic erzeugt worden
Life is a short
Ich arbeite mit .net 1.1 und VS 2003, daher keine coolen Sprachfeatures hier 😕
Ich nehme mal an, du hast einen zwingenden Grund dafür. Weil c# ohne Generika ist überholt, und damit geschriebenes ist quasi prinzipiell von schlechter Qualität, einfach, weils bessere Technologien gibt.
Die anderen Versions-sprünge sind nicht so elementar, aber Generika machen zB. viele Casts überflüssig, und überflüssige Casts sind ein gravierender Qualitätsmangel.
Der frühe Apfel fängt den Wurm.
du kannst das über reflection lösen. die parameter lässt du dir in einer arraylist geben und die methode zum aufrufen in form eines methodinfo obejktes. dann benötigst du nur noch die konkrete instanz (auch object) und schon kannst du ein invoke auf die methode machen.
Als Parameter kannst du als Typ params object[] nehmen.
> Codejunky <
Als Parameter kannst du als Typ params object[] nehmen.
Das ist mir bewusst, aber die aufzurufende Methoden sind explizit definiert, wie soll eine Methode mit der Signatur params object[] eine betreffende Methode mal mit int, string, mal nur mit string, mal mit string, string füllen?
Life is a short