2016-04-26 67 views
1

第一個代碼示例:如何從父母和孩子擴展方法具有相同的名稱

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 

那麼,是不是可以做到什麼,我在這裏做什麼? 我認爲最具體的延伸將被拿起,但顯然並非如此。

+0

,爲什麼孩子一偶存在?? –

+3

這可能會爲您澄清:https://blogs.msdn.microsoft.com/ericlippert/2009/12/10/constraints-are-not-part-of-the-signature/ – NWard

+1

[This](http:/ /stackoverflow.com/questions/31788804/how-to-hide-extension-methods-from-derived-classes?rq=1)似乎相關。 –

回答

2

您可以刪除泛型參數:

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

注:void ChildExtension::DoSomething(this Child element)將被調用,爲ChildParent更具體。


或者......這是要長得難看,戰勝具有擴展方法的目的:如果你想讓它調用父類的擴展方法

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

這解決了我的問題,但是可以從子項調用父擴展方法嗎? –

+0

@YannThibodeau在子擴展的正文中,在適當的地方添加'ParentExtension.DoSomething(element);'。 – Xiaoy312

+0

感謝您填補我缺乏的知識,歡呼。完美工作。你不可以這樣稱呼擴展方法嗎? –

相關問題