Laden...

generischer Methoden aufruf möglich?

Erstellt von Seikilos vor 13 Jahren Letzter Beitrag vor 13 Jahren 2.273 Views
S
Seikilos Themenstarter:in
753 Beiträge seit 2006
vor 13 Jahren
generischer Methoden aufruf möglich?

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

1.665 Beiträge seit 2006
vor 13 Jahren

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.

4.207 Beiträge seit 2003
vor 13 Jahren

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

www.goloroden.de
www.des-eisbaeren-blog.de

S
Seikilos Themenstarter:in
753 Beiträge seit 2006
vor 13 Jahren

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

5.299 Beiträge seit 2008
vor 13 Jahren
off topic

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.

Gelöschter Account
vor 13 Jahren

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.

1.665 Beiträge seit 2006
vor 13 Jahren

Als Parameter kannst du als Typ params object[] nehmen.

S
Seikilos Themenstarter:in
753 Beiträge seit 2006
vor 13 Jahren

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

Gelöschter Account
vor 13 Jahren

as 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?

habe ich beschrieben.

S
Seikilos Themenstarter:in
753 Beiträge seit 2006
vor 13 Jahren

Entschuldige, das mit reflections werd ich noch testen.

Life is a short