2016-04-26 8 views
1

erstes Codebeispiel zu verlängern:Wie Methode von Eltern und Kind mit dem gleichen Namen

public class Parent 
{ 

} 

public static class ParentExtension 
{ 
    public static void DoSomething<T>(this T element) where T : Parent 
    { 
     ... 
    } 
} 

public class Child : Parent 
{ 

} 
public static class ChildExtension 
{ 
    public static void DoSomething<T>(this T element) where T : Child 
    { 
     ... 
    } 
} 
//Trying to call child extension class 
var child = new Child(); 
child.DoSomething(); //Actually calls the parent extension method even though it is a child class 

So ist es möglich, zu erreichen, was ich hier tue? Ich ging davon aus, dass die spezifischste Erweiterung übernommen würde, aber das ist eindeutig nicht der Fall.

+0

Wenn Sie es die übergeordneten Erweiterungsmethode aufgerufen werden sollen, tut, warum das Kind ein selbst existieren?? –

+3

Dies kann Dinge für Sie klären: https://blogs.msdn.microsoft.com/ericlippert/2009/12/10/constraints-are-not-part-of-the-signature/ – NWard

+1

[Dies] (http://stackoverflow.com/questions/31788804/how-to-hide-extension-methods-from-derived-classes?rq=1) scheint relevant zu sein. –

Antwort

2

Sie können die generischen Parameter entfernen:

public static class ParentExtension 
{ 
    public static void DoSomething(this Parent element) 
    { 
     // ... 
    } 
} 
public static class ChildExtension 
{ 
    public static void DoSomething(this Child element) 
    { 
     // ... 
    } 
} 

Hinweis: void ChildExtension::DoSomething(this Child element) wird aufgerufen, wie Child spezifischer als Parent ist.


Oder ... Das wird hässlich aussehen und den Zweck des mit der Erweiterung Methode Niederlage:

// Invoke the method explicitly 
ParentExtension.DoSomething(child); 
ChildExtension.DoSomething(child); 
+0

Das löste mein Problem, aber wäre es möglich, die Elternerweiterungsmethode vom Kind aus aufzurufen? –

+0

@YannThibodeau Fügen Sie im Text der untergeordneten Erweiterung 'ParentExtension.DoSomething (Element);' hinzu, falls zutreffend. – Xiaoy312

+0

Danke für das Ausfüllen meines Mangels an Wissen, Prost. Arbeitete perfekt. Konnten Sie Erweiterungs-Methoden nicht so nennen. –