2009-11-12 45 views
0

可以說我有接口的一個繼承樹:確定孩子最接近接口類

IParent> ICHILD> IGrandChild

我怎麼會:

  1. 找到實現IParent
  2. 確定也是IParent子項的類的最近祖先。

例如:

var myClass = FindImplementor<IParent>(); 
var myInterface = ClosestAncestor<IParent, myclass>(); 

我不希望創建符合上述特徵,其功能。這只是爲了澄清。

IParent的後代以及實現類都在動態加載的程序集中。我不確定這是否會有所作爲。

+0

C#支持接口的多重繼承。假設有兩個從IParent繼承的接口:IChild1和IChild2。如果一個類實現IChild1和IChild2,會發生什麼? – 2009-11-12 15:55:47

+0

舊的多重繼承鑽石。在我的情況下,我沒有使用該功能。我實現多個接口的所有類都實現了沒有共同祖先的接口。 – 2009-11-12 16:01:25

+0

即使沒有「鑽石」,您仍然必須遍歷整個接口繼承樹,才能找到IParent。遞歸函數讓人想起遍歷樹來尋找某物。 – 2009-11-12 16:19:42

回答

1

您可以使用作爲關鍵字並檢查爲空。

例子:

var someObject = GetMeSomething(); //returns some IParent/IChild/IGrandChild 

if ((someObject as IParent) != null) 
    if ((someObject as IChild) != null) 
    { 
     if ((someObject as IGrandChild) != null) 
     { 
      //you have an IGrandChild 
     } 
     else 
     { 
      //you have an IChild 
     } 
    } 
    else 
    { 
     //you have an IParent 
    } 
} 
//you have something other than your interface hierarchy 

我真的不喜歡這個想法,其實,但它是什麼浮現在腦海。試圖找出鏈條有很多問題。想到多個實施鏈。

1

要獲得IParent

的「執行者」
var classes = Assembly.GetTypes(); 
var parentImplementors = classes.Where(x => x.IsAssignableFrom(typeof(IParent))); 

有沒有簡單和完美的工作方式得到"closest ancestors" of an interface

0

我希望我理解正確的問題:)

ClosestAncestor

public Type ClosestAncestor<IParent, Class>() 
{ 
    return ClosestAncestor<IParent>(typeof(Class)); 
} 

public Type ClosestAncestor<IParent>(Type typeOfClass) 
{ 
    var baseType = typeOfClass.BaseType; 
    if(typeOfClass.GetInterfaces().Contains(typeof(IParent)) && 
     ! baseType.GetInterfaces().Contains(typeof(IParent))) 
    { 
     return typeOfClass; 
    } 

    return ClosestAncestor<IParent>(baseType); 
} 

如可以看出,該代碼假定類實現IParent(否則 - 錯誤...)。

試驗樣品:

public interface I {} 
public class A {} 
public class B : A, I {} 
public class C : B {} 

[Test] 
public void ClosestAncestorTest() 
{ 
    Type closestAncestor = ClosestAncestor<I,C>(); 
    Assert.AreEqual(typeof(B), closestAncestor); 
} 

FindImplementor

載入第一類型實現接口:

public Type FindImplementor<T>() 
{ 
    return AppDomain.CurrentDomain.GetAssemblies() 
     .SelectMany(assembly => assembly.GetTypes()) 
     .FirstOrDefault(type => type.GetInterfaces().Contains(typeof(T))); 
} 

我假定該組件被加載到應用程序域和碼搜索一個實施者的地方。如果只有單個程序集很有趣,那麼你只能得到這個程序集類型(就像在Guillaume的答案中一樣)

+0

當Type和BaseType都實現IParent接口時,您的最靠近的祖先將失敗。 – Guillaume 2009-11-16 08:32:54

+0

@Guillaume,你是對的,這是一個錯誤:) – Elisha 2009-11-16 18:40:13