Laden...

Predicate<object> in Methode Funktion als Parameter -

Erstellt von mfe vor 15 Jahren Letzter Beitrag vor 15 Jahren 1.307 Views
M
mfe Themenstarter:in
177 Beiträge seit 2009
vor 15 Jahren
Predicate<object> in Methode Funktion als Parameter -

Hallo,

ich habe eine rekurisve Methode die ein Datenmodel durchläuft. Ich will, dass man dieser rekurisven Methode als Parameter eine Funktion mit übergeben kann.

Die übergebene Funktion soll Daten manipulieren.

Hier die rekursive Methode:

        public static ClassA GoThroughClass(ClassA pClassA, Predicate<ClassA> pPredicate)
        {
            pPredicate(pClassA);
            System.Diagnostics.Debug.WriteLine(pClassA.Propstring);
            foreach (ClassA ca in pClassA.ClassAList)
                GoThroughClass(ca, pPredicate);
            return pClassA;
        }

Die Extension bzw. die Funktion die ich übergebe und die Daten manipuliert sieht so aus:

                public static ClassA AddText(ClassA pClassA)
        {
            pClassA.Propstring = pClassA.Propstring + " Cloned";
            return pClassA;
        }

Ich probiere die Funktion wie folt auf zu rufen.
GoThroughClass(classa, AddText(classa));
GoThroughClass(classa, AddText);
GoThroughClass(classa, AddText<ClassA>);
...

Ich erhalte aber immer die Fehlermeldung:

Error 1 The non-generic method 'LINQRekursion.Program.AddText(LINQRekursion.ClassA)' cannot be used with type arguments

mit GoThroughClass(classa, AddText<ClassA>);

Hat jemand eine Idee wie ich die Funktion übergeben muss?

104 Beiträge seit 2004
vor 15 Jahren

Hallo mfe,

Ein Delegate vom Type Predicate<T> ist nicht dafür geeignet um Daten zu manipulieren.
Vielmehr ist es dafür gedacht, um zu bestimmen ob eine Bedinung für ein Objekt erfüllt ist oder nicht.

Schau dir mal Beispiele für Delegates vom Typ Action<T, ...> an. Das dürfte dir weiter helfen.

Schöne Grüße

Schaut mal im IRC vorbei:
Server: irc.euirc.net
Channel: #C#

49.485 Beiträge seit 2005
vor 15 Jahren

Hallo mfe,

ohne das getestet zu haben, würde ich auf GoThroughClass(classa, new Predicate <ClassA> (AddText)); tippen. Sollte aber auch in der :rtfm: Doku stehen.

herbivore

M
mfe Themenstarter:in
177 Beiträge seit 2009
vor 15 Jahren

Hallo,

danke funktioniert.

Laut Doku muss dem Predicate übergebene Funktion einen boolschen Wert zurück geben. Was muss ich verwenden damit die übergebene Funktion objects zurück geben darf kann?

49.485 Beiträge seit 2005
vor 15 Jahren

Hallo mfe,

du musst dir selber einen passenden Delegatentyp definieren.

herbivore

656 Beiträge seit 2008
vor 15 Jahren

...oder alternativ Func<TIn1, ..., TResult> verwenden.
Was du in dem Fall suchst wäre ein Func<ClassA, ClassA> - rein kommt "ClassA" (der erste Typparameter), raus kommt "ClassA" (der letzte Typparameter).

Gruß, BhaaL

M
mfe Themenstarter:in
177 Beiträge seit 2009
vor 15 Jahren

Was du in dem Fall suchst wäre ein Func<ClassA, ClassA> - rein kommt "ClassA" (der erste Typparameter), raus kommt "ClassA" (der letzte Typparameter).

Genau das habe ich gesucht!
Danke lg.