5 Stimmen

Bessere Möglichkeit, eine statische Methode zu definieren

Ich stehe vor der Anforderung, eine statische Methode in meiner Basisklasse zu erstellen, aber ich mag es nicht, dass ich Typargumente deklarieren muss, deshalb frage ich mich, ob ich das richtig mache.

Im Grunde weise ich Delegaten zu, die ich mit Eigenschaften in der Klasse verknüpfen werde. Ich könnte die Methode einfach in den abgeleiteten Klassen platzieren, wie folgt:

public class Foo 
{
   public string Property1 { get; set; }
}

public class InheritsFoo : Foo 
{
    public void AssignDel(
        Expression> expr, 
        Action action) 
    {
    }
}

Oder ich könnte dies in einer Erweiterungsklasse tun:

public static void AssignDel(
    this T source, 
    Expression> expression, 
    Action action) 
    where T : Foo 
{
}

Beide ermöglichen es mir, AssignDel in einer instanziierten Klasse zu verwenden:

var foo = new InheritsFoo();
foo.AssignDel(x => x.Property1, handler);

Aber ich muss AssignDel statisch machen. Auf diese Weise wird die Verlängerungsmethode nutzlos. Es funktioniert immer noch in InheritsFoo, aber ich möchte das wirklich in die Basisklasse verschieben. Wenn ich es versuche, können die generischen Argumente nicht abgeleitet werden, und ich muss die Verwendung der Methode ändern:

InheritsFoo.AssignDel(x => x.Property1, handler);

Gibt es hier einen Ausweg, einen anderen Weg, den ich nicht bedacht habe?

EDIT: Um das Problem aus den Kommentaren zu adressieren, ob die Erweiterungsmethode funktionieren würde/sollte... Ich bin zu der von @Mark M. referenzierten URL gegangen. Es stellt sich heraus, dass wenn ich es wie folgt schreibe...

InheritsFoo foo = null;
foo.AssignDel(x => x.Property1, handler);

Das kompiliert (weiß aber nicht, ob es funktionieren wird). Trotzdem denke ich nicht, dass das als Verwendung einer statischen Methode qualifiziert, da 'foo' immer noch als Instanz betrachtet wird; Eine Nullinstanz, aber dennoch eine Instanz.

1voto

Security Hound Punkte 2508

Aber ich habe die Anforderung, AssignDel statisch zu machen. Dies macht die Erweiterungsmethode nutzlos. Es funktioniert immer noch in InheritsFoo, aber ich möchte das wirklich in die Basisklasse verschieben. Wenn ich es versuche, kann das allgemeine Argument nicht abgeleitet werden, und ich muss die Verwendung der Methode ändern:

Dies ergibt nicht viel Sinn.

InheritsFoo.AssignDel ist eine statische Methode.

Sie rufen besagte statische Methode auf, indem Sie InheritsFoo.AssignDel(x => x.Property1, handler); verwenden, es scheint Ihren Anforderungen zu entsprechen.

Ich verstehe nicht, was falsch an der zweiten Option ist, auf die Sie gekommen sind. Es tut, was Sie tun müssen, es ist klar, was passiert, liegt es wirklich daran, dass Sie InheritsFoo und string anstelle von foo.AssignDel(x => x.Property1, handler); übergeben?

Es scheint, Sie könnten einfach folgendes tun und erreichen, was Sie wollen.

   public class Foo 
    {
       public string Property1 { get; set; }
    }

    public class InheritsFoo : Foo 
    {
        public static void AssignDel(
            Expression> expr, 
            Action action) 
        {
        }
    }

Ich muss etwas übersehen, denn es scheint, dass Sie es verwenden würden InheritsFoo.AssignDel(x => x.Property1, handler);, was genau das ist, was Sie wollen.

1voto

Ivo Punkte 8053

Die Erweiterungsmethode ist bereits statisch.

Anzunehmen, Sie müssen sie nicht auf die Erweiterungsmethodenweise verwenden, sollte dies funktionieren:

InheritsFoo.AssignDel(x => x.Property1, handler);

Wie auch bei der Erweiterungsmethodenform wird der Compiler die Typparameter für die altmodische statische Methode inferieren.

Wenn Sie die Methode mit zwei Typparametern benötigen, könnten Sie eine generische Klasse dafür erstellen:

public class Foo where T : Foo {

    public void AssignDel( Expression> expr, Action action) 
    {
         //...
    }
}

In diesem Fall könnten Sie Folgendes tun:

Foo.AssignDel(x => x.PropertyFromInheritFoo, handler); 

Wie Sie sehen können, müssen Sie nur einen Typparameter deklarieren, der andere wird inferiert.

Hoffe, es hilft

0voto

Random Punkte 1856

Ich habe es geschafft, indem ich einfach eine weitere Ebene in der Vererbungskette implementiert habe.

public class Foo  
{    
   public string Property1 { get; set; } 
} 

public class Foo : Foo
{
   public static void AssignDel(Expression> expr, Action action)
   {   }
}

public class InheritsFoo : Foo
{     } 

Ich kann InheritsFoo genau so behandeln, wie ich es brauche.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X