mayho33
Goto Top

C-Sharp Extension Methods kombinieren

Hi @ All!

Ich suche Heute schon den ganzen Vormittag nach einer Möglichkeit 2 Extensions in einem Commando zu bündeln wie es etwa via LINQ (Lambda) möglich ist.
Bsp:

Ich habe 2 Extentions eine prüft ob ein Pfad existiert .Exists() und die andere löscht den Pfad .Delete()

Bisher habe ich diese Kombination so aufgerufen:
if(path.Exists())
{
    bool return = path.Delete();
}

Ich würde das ganze aber gerne so verwenden:

bool success = path.Exists().Delete();

Hat das schon mal jemand gemacht? Geht das überhaupt? Wo finde ich dazu etwas oder hat jemand ein kleines Beispiel?

Danke für die Unterstützung!

Grüße!

mayho

Content-ID: 269692

Url: https://administrator.de/contentid/269692

Ausgedruckt am: 25.11.2024 um 15:11 Uhr

opalka
opalka 20.04.2015 aktualisiert um 11:21:05 Uhr
Goto Top
Hallo,

nö, dass geht nicht. Da du die Methode Delete auf ein True ausführen würdest. Was du aber machen könntest wäre folgendes:


bool success = (path.Exists()) ? path.Delete() : false;

EDIT: Nö, das geht leider auch nicht, da Delete() kein bool zurückliefert. Sorry.
mayho33
mayho33 20.04.2015 um 11:39:57 Uhr
Goto Top
Hi!

Eigentlich liefere ich in beiden Extension ein bool zurück. Habe das falsch angegeben im Code (bereinigt).
opalka
opalka 20.04.2015 um 11:51:15 Uhr
Goto Top
Na dann sollte das

bool success = (path.Exists()) ? path.Delete() : false; 

doch funktionierten
opalka
opalka 20.04.2015 um 11:54:13 Uhr
Goto Top
oder aber du änderst deine Extension dahingehend ab, dass Exists das Pfadobjekt zurückgibt, dann würde path.Exists().Delete() funktionieren. Es gehört sich nur nicht, dass Exists etwas anderes als bool liefert. Aber ist deine Entscheidung.
114757
114757 20.04.2015 aktualisiert um 11:59:24 Uhr
Goto Top
Eigentlich liefere ich in beiden Extension ein bool zurück. Habe das falsch angegeben im Code (bereinigt).
OK aber dann weis deine Extension-Function nicht welchen Pfad es handhaben muss face-wink

Was ginge wäre z.B. das hier, aber eigentlich umständlich (ist jetzt gerade nur VB.Net)
Imports System.IO
Imports System.Runtime.CompilerServices
Module Module1
    Sub Main()
        Dim strPath = "C:\Temp\demopfad"  
        Dim success As Boolean = System.IO.Directory.Exists(strPath).Delete(strPath)
        Console.WriteLine(success)
        Console.ReadLine()
    End Sub

End Module

Public Module MyExtensions
    <Extension()> _
    Public Function Delete(result As Boolean, strPath As String) As Boolean
        If result Then
            Try
                Directory.Delete(strPath, True)
                Return True
            Catch ex As Exception
                Return False
            End Try
        Else
            Return False
        End If
    End Function
End Module
Gruß jodel32
mayho33
mayho33 20.04.2015 aktualisiert um 12:12:27 Uhr
Goto Top
Hi!

@ opalka: Ja, Danke! das würde funktionieren. Leider kennt sich dann keiner meiner Kollegen mehr aus wie, was, wann bei einer Kombi passieren muss bzw. wie der Aufruf ausschauen soll.
Puhhh! Dachte so ne "Lambda-Like"-Sache wäre einfacher umzusetzen.

Trotzdem Danke! Habe es mir auf jeden Fall mal ins Hirn gemeißelt.
114757
Lösung 114757 20.04.2015, aktualisiert am 29.04.2015 um 19:18:35 Uhr
Goto Top
Denke dafür musst du die "Exists" Funktion in einer eigenen Klasse überladen, so dass sie den Pfad zurückgibt anstatt einem Bool.
mayho33
mayho33 20.04.2015, aktualisiert am 29.04.2015 um 19:18:21 Uhr
Goto Top
Danke Jodel!

Das schaue ich mir auch gerne an. Feedback wird etwas dauern, kommt aber ganz sicher.

Grüße mayho

EDIT: 29.04.2015

Hi @ All

Also ich habe mal etwas eingehender über meine Anforderung oben nachgedacht und bin schlussendlich der Meinung, dass das eigentlich keinen Sinn macht.
Genau so gut kann ich nur .Delete() .Create() .Move() usw. machenund in der jeweiligen Extension die Prüfung .Exists() machen.

Grundsätzlich würde dein Ansatz @114757 wohl auch funktioniert. Wenn man bedenkt dass beide Extensions einen String erwarten eigenlich logisch. Habe es aber nciht mehr getestet.

Danke jedenfalls für die Unterstützung euch beiden!

Grüße!

Mayho
opalka
Lösung opalka 20.04.2015, aktualisiert am 29.04.2015 um 19:18:30 Uhr
Goto Top
Na dein Exists() liefert ja ein Bool zurück, also kannst Du nur Methoden dranhängen, die ein Bool hat, also z.B. toString(). Bei einem File-Objekt gibt File.GetCreationTime() ein DateTime zurück, so dass z.B. File.GetCreationTime().Year das Jahr der Erstellung zurück gibt, ohne

DateTime dt = File.GetCreationTime();
int year = dt.Year;

zu schreiben.