2012-04-04 7 views
0

ich es geschafft haben, eine mehrere Zeile Code zu diesemReduzierung .Net Code Inline Objekterstellung mit

For Each gal In galleries 
    With New HtmlGenericControl("div") 
       .ID = gal.Header 
       .Controls.Add(New HtmlImage() With {.Src = "http://p.com/pic.jpg"}) 

       galleryContent.Controls.Add(**Me**) 
    End With 
Next 

crunch nach unten ich nicht finden können, wo, wie auf das Objekt verweisen zurück i gerade mit arbeite Fügen Sie das Steuerelement zurück zu 'galleryContent' - Mit der einfachen me stürzt der gesamte Webserver ... whooops.

Verwendung bietet nicht die kürzere Hand von nur mit . - Aber es mit der einzigen Möglichkeit, es zu tun? Ich war sersiosly erwartet eine Art von .Me oder etwas wie this

Irgendwelche Ideen?

+1

[Kann nicht] (http://stackoverflow.com/questions/1152983/how-to-access-the-object-itself-in-with-end-with). Selbst im ähnlichen C# -Konstrukt können Sie nicht. – AakashM

+2

Nicht versuchen, Ihre Frage zu beantworten, aber wenn Sie das gelöst bekommen, wäre ein guter Komponententest dafür, es einem anderen Entwickler zu geben und ihn zu bitten herauszufinden, was es versucht zu machen. Lesbarkeit ist König, Debuggierbarkeit ist Erbe des Throns. –

+0

Das ist die Schönheit von .NET-VB .. Es macht nur lesbaren Sinn, solange es so kurz wie möglich ist. In C# wird das Komprimieren so horrend, aber C# hat andere Vorteile. – ppumkin

Antwort

5

Sie können nicht. Zumindest nicht so.

Try this:

For Each gal In galleries 
    Dim obj as New HtmlGenericControl("div") 
    With obj 
     .ID = gal.Header 
     .Controls.Add(New HtmlImage() With {.Src = "http://p.com/pic.jpg"}) 

     galleryContent.Controls.Add(ojb) 
    End With 
Next 
+0

Leider, Das ist die Methode, die ich vor einer Stunde geschrieben habe :-) Aber ich dachte, ich könnte versuchen, es zu zerquetschen und zu sehen, wie weit ich gehen kann. Aber das Einbetten anonymer Funktionen erweist sich in VB als unnatürlich. Besser Linq verwenden? Hast du ein Beispiel? :-) – ppumkin

1

Sie können so etwas wie tun:

For Each gal in galleries 
    galleryContent.Controls.Add(New HtmlGenericControl("div") With { .ID = gal.Header }) 
    galleryContent.Controls[galleryContent.Controls.Count - 1].Controls.Add(New HtmlImage() With {.Src = "http://p.com/pic.jpg"}) 
Next 

Aber das ist rein für Line-Reduktion. Es reduziert die Lesbarkeit erheblich, sodass Sie in jedem normalen Szenario nicht nur darauf abzielen sollten, Codezeilen zu reduzieren. Lesbarkeit ist viel wichtiger als "Linieneffizienz".

+0

macht Sinn .. Ich musste das Hinzufügen der anonymen Funktion auf die oberste Ebene wickeln .. kein Wunder :) sehr nett .. Testen jetzt! – ppumkin

+0

Es funktioniert nicht .. weil die .Controls.Add nicht als eine Eigenschaft von HtmlGeneric-Steuerelement existiert, aber eine Funktion .. so bummer .. Und ja .. Es beginnt, aber eine ungerade aussehen. – ppumkin

+0

Okay, das macht Sinn. Ich habe nicht wirklich nachgedacht, als ich das Snippet geschrieben habe. Aus Neugier, hat Ihre "galleryContent.Controls" eine "AddRange" -Methode? –

2

Mystere Man Recht ist, aber darüber nachdenken, dass .... das wird die Lesbarkeit des Codes beeinträchtigen.

„Code wird viel häufiger gelesen als geschrieben steht, so entsprechend planen“

Ich würde vorschlagen, mit „Mit“ in VB zu vermeiden ... es sei denn, Sie wirklich „müssen“.

Ich hoffe, es hilft.