2012-05-18 18 views
5

Ich stehe vor der Anforderung, eine statische Methode für meine Basisklasse zu erstellen, aber ich mag es nicht, dass ich Typargumente deklarieren muss, also frage ich mich, ob ich das tue der richtige Weg.Bessere Methode zum Definieren der statischen Methode

Im Grunde gebe ich Delegaten, die ich mit Eigenschaften für die Klasse verknüpfen werde. Ich könnte leicht die Methode auf die vererbten Klassen setzen, etwa so:

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

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

Oder in einer Nebenklasse, konnte ich dies tun:

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

Beide würden mir ermöglichen, verwenden AssignDel in eine instanzierte Klasse:

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

Aber ich habe eine Verpflichtung AssignDel statisch zu machen. Dies macht die Erweiterung zu nutzlos. Es funktioniert immer noch in InheritsFoo, aber ich möchte dies wirklich in die Basisklasse verschieben. Wenn ich versuche, kann das Generika Argument nicht abgeleitet werden, und ich habe die Verwendung des Verfahrens zu ändern:

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

Gibt es eine Möglichkeit sich hier, eine andere Art und Weise, dies zu tun habe ich nicht gedacht?

EDIT: um das Problem in den Kommentaren zu adressieren, ob die Extension-Methode würde/sollte funktionieren ... Ich ging zu der URL von @Mark M verwiesen. Stellt sich heraus, wenn ich es so schreibe ...

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

das compiliert (weiß nicht, ob es läuft, obwohl). Glauben Sie nicht, dass dies eine statische Methode ist, da 'foo' immer noch als Instanz betrachtet wird; Eine Null-Instanz, aber trotzdem eine Instanz.

+3

Erweiterungsmethoden sind bereits statisch. Wie verhindert eine Anforderung, die Methode statisch zu machen, die Verwendung von Erweiterungsmethoden? –

+3

"Ich habe die Anforderung,' AssignDel' statisch zu machen ". Dann mach es statisch. –

+1

@Kirk: Obwohl Erweiterungsmethoden als statische Methoden definiert sind, können sie nur als Instanzmethoden der beabsichtigten Klasse verwendet werden. –

Antwort

0

hilft ich es geschafft, zu tun, was ich brauchte nur um eine weitere Ebene in der Vererbungskette umzusetzen.

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

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

public class InheritsFoo : Foo<InheritsFoo> 
{  } 

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

1

Aber ich habe eine Verpflichtung AssignDel statisch zu machen. Dies macht die Erweiterung Weg es nutzlos zu machen. Es funktioniert immer noch in InheritsFoo, aber Ich möchte wirklich dies in die Basisklasse verschieben. Wenn ich versuche, kann die Generika Argument nicht abgeleitet werden, und ich habe die Verwendung der Methode ändern:

Dies gilt nicht viel Sinn machen.

InheritsFoo.AssignDel ist eine statische Methode.

Sie nennen diese statische Methode InheritsFoo.AssignDel<InheritsFoo, string>(x => x.Property1, handler); Sie scheint Ihre Anforderungen zu erfüllen.

Ich verstehe nicht, was falsch ist mit der zweiten Option, die Sie kamen. Es tut, was Sie tun müssen, ist klar, was passiert, ist es wirklich, weil Sie InheritsFoo und string statt 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<TVal>(
      Expression<Func<InheritsFoo, TVal>> expr, 
      Action<InheritsFoo, TVal> action) 
     { 
     } 
    } 

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

+0

Das Angeben der Generics-Argumente funktioniert zwar, ist aber ausführlicher als dies bevorzugt wäre, insbesondere im Fall des TVal-Arguments. Deshalb frage ich nach Alternativen. – Random

1

Die Erweiterungsmethode ist bereits statisch.

Angenommen, Sie müssen nicht in der Verlängerung Methode Art und Weise verwenden, sollte diese Arbeit:

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

In der gleichen Art und Weise der Compiler die Typparameter für die Erweiterungsmethode Form infere wird, wird es für die alte statische Art und Weise.

Wenn Sie die Methode mit zwei Typen paremeters haben müssen, können Sie eine generische Klasse für diese schaffen könnten:

public class Foo<T> where T : Foo { 

    public void AssignDel<TVal>(Expression<Func<T, TVal>> expr, Action<T, TVal> action) 
    { 
     //... 
    } 
} 

In diesem Fall könnten Sie tun:

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

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

Hoffe, dass es

+0

Dies funktioniert, wenn ich die Methode in InheritsFoo halte, wenn ich sie in die Basis-Foo-Klasse verschieben möchte. – Random

+0

Oh! Ich habe das Problem, vor dem Sie stehen. Es scheint, dass Sie Schraube sind :( – ivowiblo

+0

Also ... lassen Sie mich überprüfen, ob ich verstanden habe: Sie wollen die Methode in der Foo-Klasse haben und Eigenschaften für die gesamte Hierarchie zu akzeptieren? – ivowiblo

Verwandte Themen