Autor Beitrag
BlackMatrix
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 243
Erhaltene Danke: 1



BeitragVerfasst: Mi 24.03.10 21:31 
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?

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 222
Erhaltene Danke: 16

Win XP, Win 7 64-Bit
C# 4.0 (VS2010)
BeitragVerfasst: Mi 24.03.10 22:18 
du könntest es als mit dem "params" schlüsselwort lösen...

msdn.microsoft.com/e...ibrary/w5zay9db.aspx
danielf
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1012
Erhaltene Danke: 24

Windows XP
C#, Visual Studio
BeitragVerfasst: 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:
ausblenden 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
ausblenden C#-Quelltext
1:
2:
WebClient wc = new WebClient();
string html = wc.DownloadString(url);

raten.

Gruß Daniel
BlackMatrix Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 243
Erhaltene Danke: 1



BeitragVerfasst: 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.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: 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 ;-) stevenbenner.com/201...parameters-in-c-4-0/

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
Greenberet
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 339
Erhaltene Danke: 20

Win 10
C# (VS 2012), C++ (VS 2012/GCC), PAWN(Notepad++), Java(NetBeans)
BeitragVerfasst: Mi 24.03.10 23:13 
Was spricht gegen eine Struktur als Parameter?

bsp:

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1012
Erhaltene Danke: 24

Windows XP
C#, Visual Studio
BeitragVerfasst: 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.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: 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# ;-)

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
Kha
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: 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 :) .

_________________
>λ=