2016-01-06 39 views
0

我有一個返回接口的函數。獲取類型作爲接口從函數返回

我想避免一堆IF ELSE並通過反射獲取類型。 所以我傳入命名空間,類型名稱和程序集名稱作爲字符串並構造類型確定。 但是,我被困在如何將它作爲界面返回。

我的界面名稱爲ILevel2。我返回所有實現它的類型,所以我希望folllowing會的工作,但沒有喜悅尚未...

有人能指出我在正確的方向.....

string instanceReq = String.Format("{0}.{1}, {2}", nameSpace, typName, assseblyName); 
    var myType = Type.GetType(instanceReq); 
    ILevel2 myInterface = myType.GetInterface("ILevel2"); 

    return myInterface; 

我得到一個編譯器錯誤就行了設置MyInterface的= .....

錯誤114無法隱式轉換類型 '的System.Type' 到 'Level2Obligations.ILevel2'。一個顯式轉換存在(是否 缺少 投?)d:\ TFS \ StockMaster_ECodes \ StockMaster_ECode_Admin_MVC5 \的WebAPI \ ECode_Web_Api \型號\ ECodeLevel2Request.cs 103 35 ECode_Web_Api

添加更多的細節......

在此刻一塌糊塗,但你可以看到 - 我想成爲更通用的,而不是IF(namesapaceandType ==「bghjbj」)

private ILevel2 GetDLLInstance(string namespaceAndType) 
{ 
    var assseblyName = "Level2_Mock_Api"; 
    var nameSpace = "Level2_Mock_Api"; 
    var typName = "MockAPI"; 

    string instanceReq = String.Format("{0}.{1}, {2}", nameSpace, typName, assseblyName); 
    var myType = Type.GetType(instanceReq); 
    var myInterface = (ILevel2)myType.GetInterface("ILevel2"); 

    return myInterface; 

    if (namespaceAndType.ToUpper() == "LEVEL2_MOCK_API.MOCKAPI") 
    { 
     return new Level2_Mock_Api.MockAPI(); 
    } 
    else...... 

如果任何人有在未來這個問題這裏是我已經支持的功能....... ....

private ILevel2 GetDLLInstance(string AssemblyNamespaceAndType) 
{ 
    //As the name suggests this should be the Assembly Namespace and Type seperated by fullstops and is case sensitve 
    //eg Level2_Mock_Api.Level2_Mock_Api.MockAPI 
    string[] apiDetails = AssemblyNamespaceAndType.Split('.'); 
    var assseblyName = apiDetails[0]; 
    var nameSpace = apiDetails[1]; 
    var typeName = apiDetails[2]; 
    string typeReq = String.Format("{0}.{1}, {2}", nameSpace, typeName, assseblyName); 
    var myType = Type.GetType(typeReq); 
    if (myType != null) 
     return (ILevel2)Activator.CreateInstance(myType); 

    return null; 
} 

所以,現在,因爲當我需要添加新的實現,我只需要確保它們實現的接口,我會好到哪裏去;)

+0

聽起來好像你需要構建一個*實例類型......目前還不清楚你想要實現什麼。如果你包含一個簡短的*完整的*示例(而不是片段),這將使它更容易幫助你 –

+0

Aaaaah - 我看到喬恩,我有類型,現在創建一個這種類型的實例.... 我'我會看到我如何繼續。 – AntDC

+1

以及希望我的回答將有助於在這方面:) –

回答

4

我懷疑你只需要創建類的實例,並把它轉換到你有信心它實現的接口:

return (ILevel2) Activator.CreateInstance(myType); 

將使用參數的構造函數,但是 - 如果你需要調用不同的構造函數,你可以撥打myType.GetConstructors(),或撥打Activator.CreateInstance(Type, Object[])讓它選擇構造函數來調用。

+0

謝謝。 已經將instanceReq重命名爲typeReq;) 再次感謝。很有用 – AntDC