Entwickler-Ecke

Basistechnologien - ausgewählte Übergabeparameter übergeben & Methode ausführen?


BlackMatrix - Mi 24.03.10 21:31
Titel: ausgewählte Übergabeparameter übergeben & Methode ausführen?
Ich bin noch nicht sehr weit in die Vorteile der Objektorientierung vorgedrungen, aber ich bin mir ziemlich sicher, dass man das realisieren kann.

Ich möchte mein Problem gern an einem Beispiel festmachen.

Ich habe bei meiner Methode gethtml, ja verschiedene Parameter (Accept, Referer, Useragent), die ich einstellen kann.

Und nun möchte ich eben, dass egal wieviel Parameter ich übergebe, er die Anfrage trotzdem ausführt.

Also, wenn ich z.B. nur Accept und useragent übergebe, dann soll er die Anfrage mit diesen beiden Parametern durchführen, aber Referer soll eben "" bleiben.

Wie habe ich das zu realisieren, ohne die Methode 6x zu schreiben, um alle Möglichkeiten zu realisieren? In eine Klasse packen?


C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
        private static string gethtml(string url)
        {
            HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(url);
            request.Referer = "";
            request.Accept = "";
            request.UserAgent = useragent;
            HttpWebResponse response = (HttpWebResponse)request.GetResponse();
            StreamReader sr = new StreamReader(response.GetResponseStream());
            string html = sr.ReadToEnd();
            return html;
        }


norman2306 - Mi 24.03.10 22:18

du könntest es als mit dem "params" schlüsselwort lösen...

http://msdn.microsoft.com/en-us/library/w5zay9db.aspx


danielf - Mi 24.03.10 22:22

Hallo,

es bleibt dir nichts anderes übrig als die Methode mit den verschiedenen Verianten zu schreiben. Das nennt man dann die Methode überladen (gleicher Methodenname, andere Parameter). Allerdings kannst du die Methoden weiterleiten und so nur eine implementieren:

C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
private static string GetHtml(string url)
{
    return GetHtml(url, "");
}

private static string GetHtml(string url, string referer)
{
    return GetHtml(url, referer, "");
}

private static string GetHtml(string url, string referer, string accept)
{
    return GetHtml(url, referer, accept, "");
}

private static string GetHtml(string url, string referer, string accept, string userAgent)
{
   HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(url);
   request.Referer = referer;
   request.Accept = accept;
   request.UserAgent = useragent;
   HttpWebResponse response = (HttpWebResponse)request.GetResponse();
   StreamReader sr = new StreamReader(response.GetResponseStream());
   string html = sr.ReadToEnd();
   return html;
}


Ich würde dir aber in deinem Fall zu

C#-Quelltext
1:
2:
WebClient wc = new WebClient();
string html = wc.DownloadString(url);

raten.

Gruß Daniel


BlackMatrix - Mi 24.03.10 22:48

Danke für die Antworten =)

Werde mich wohl mal mit dem MSDN Link beschäftigen.

Dein Code ist gut Daniel, danke. Aber das Problem ist, dass ich ja zusätzlich noch alle Kombinationen durchgehen muss. Das mag bei 3 Parametern ja noch in Ordnung sein, aber wenn es dann 5 sind, müsste ich glaube 120 verschiedene Überlagerungen schreiben.

Hab aus Versehen die Zeile mit dem Cookiecontainer gelöscht, daher fällt Webclient auch wieder flach ;)

Danke euch beiden.


Christian S. - Mi 24.03.10 22:52

Naja, man erstellt eigentlich nicht für jede erdenkliche Kombination eine Überladung, insbesondere weil sie ja nicht alle beim Aufruf unterscheidbar sind. Man muss sich halt Gedanken machen, wo es sinnvoll ist, eine Überladung anzulegen und wo es "zumutbar" ist, dass man halt mal einen Parameter mit "" übergeben muss, weil man ihn nicht braucht.

//Edit: Oder Du nimmst C# 4.0 ;-) http://stevenbenner.com/2010/02/optional-parameters-and-named-parameters-in-c-4-0/


Greenberet - Mi 24.03.10 23:13

Was spricht gegen eine Struktur als Parameter?

bsp:


C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
struct HTTPSettings
{
    string url;
    string referer;
    string accept;
    //...
}

private static string gethtml( HTTPSettings settings )
{
   //...
}


danielf - Mi 24.03.10 23:19

@Christian S.
Sind doch alle beim Aufruf unterscheid bar....

Ich würde es auch nicht so machen, aber ich dachte das war sein "Wunsch". Würde es wie Greenberet machen.

zu .net 4.0, das sieht ja schon aus wie php oder python :(
Find ich voll hässlich... das gleiche schon wie var in 3.5. Auch wenn ich es aus bequemlichkeit gerne nutze ...


Christian S. - Mi 24.03.10 23:31

user profile icondanielf hat folgendes geschrieben Zum zitierten Posting springen:
@Christian S.
Sind doch alle beim Aufruf unterscheid bar....

Ich bezog mich auf BlackMatrix 120 Überladungen. Und da werden die nicht mehr unterscheidbar sein, weil es z.B. mehrere geben wird, wo beim Aufruf drei Strings hintereinander stehen.

user profile icondanielf hat folgendes geschrieben Zum zitierten Posting springen:
zu .net 4.0, das sieht ja schon aus wie php oder python :(

Wirklich schön ist das nicht, aber Methoden, die so viele Parameter haben, dass man das braucht, sind eh nicht schön :D

user profile icondanielf hat folgendes geschrieben Zum zitierten Posting springen:
Find ich voll hässlich... das gleiche schon wie var in 3.5. Auch wenn ich es aus bequemlichkeit gerne nutze ...
Type inference finde ich eigentlich ziemlich gut lesbar, meiner Meinung nach entfernt es in einem Großteil der Fälle Typangaben, die den Leser eher abgelenkt hätten und nur selten Zusatzinformation bieten.

Ich find ja aber auch Delphi Prism schöner als C# ;-)


Kha - Do 25.03.10 00:39

user profile iconGreenberet hat folgendes geschrieben Zum zitierten Posting springen:
Was spricht gegen eine Struktur als Parameter?
Warum gerade ein Struct? Wenn überhaupt, dann sollte bei GetHtml das static weggelassen und die entsprechenden Properties in diesem Typ selbst deklariert werden. Das entspricht dem im Framework allgegenwärtigen "Create-Set-Call"-Pattern; bestes Beispiel in diesem Zusammenhang wäre eben WebRequest ;) .

Zur Klarstellung: Geht es im Speziellen nur um einen Fall wie die vorgestellte Methode, würde man sich gar keine Mühe geben, dafür das Facade Pattern aufzuzuiehen. Eine einfache Extension Method wäre vollkommen ausreichend - oder natürlich wie von user profile icondanielf erwähnt DownloadString :D .

user profile icondanielf hat folgendes geschrieben Zum zitierten Posting springen:
zu .net 4.0, das sieht ja schon aus wie [...] python
Na dann passt es doch :) .