2012-03-23 90 views
3

定義我有以下兩個接口:接口不包含方法

public interface IMembershipProvider 
{ 
    object Login(ILoginProviderParameters loginParameters); 
    void SetAuthCookie(string userName, bool createPersistentCookie); 
} 

public interface IFacebookMembershipProvider : IMembershipProvider{} 

和執行力度:

public class FacebookMembershipProvider: IFacebookMembershipProvider 
{ 
    public object Login(ILoginProviderParameters loginParameters) 
    { 
     // Facebook login code is here 
    } 

    public void SetAuthCookie(string userName, bool createPersistentCookie) 
    { 
     FormsAuthentication.SetAuthCookie(userName, createPersistentCookie); 
    } 
} 

這被注入到我的控制器和分配給:

private readonly IFacebookMembershipProvider _facebookMembershipProvider; 

我可以調用Login方法,但沒有任何問題,但是當我打電話給SetAuthCookie方法:

_facebookMembershipProvider.SetAuthCookie(user.id, false); 

我收到的錯誤:

MyNamespace.UserManagement.Interfaces.IFacebookMembershipProvider' does not contain a definition for 'SetAuthCookie'

什麼我與登錄方法,我不是用SetAuthCookie方法做着做着不同?

明確鑄造類型IMembershipProvier作品就好了:

((IMembershipProvider)_facebookMembershipProvider).SetAuthCookie(user.id, false); 

我可能只是錯過了一些簡陋。謝謝參觀。

UPDATE

響應於標記的問題,第一個參數被傳遞給SetAuthCookie方法來自於一個dynamic對象。

dynamic user = _authorizeUserCommand.Invoke(_authorizeUserParams); 
+0

+1這很難相信。沒有舊的DLL敲打你的機器?它可以是Resharper /類似的舊緩存嗎? – Aliostad 2012-03-23 09:52:30

+1

您是否在使用類似'dynamic',或任何裝飾平臺或類似的東西?任何元編程或IoC/DI堆棧?基本上,它看起來像一些代碼(通常是元編程,通過ILGenerator)試圖錯誤地調用該方法。它不*聽起來*就像C#編譯器會出錯的東西。 – 2012-03-23 09:55:40

+0

我在本地和我的外部服務器上遇到同樣的問題。我已經刪除並重新添加了對我的UserManagement DLL的引用。看起來它可能是緩存問題。 – 2012-03-23 09:55:40

回答

4

dynamic(評論)的詛咒!動態出血。特別是,只要涉及表達式中的dynamic整個事物都會使用dynamic規則執行,這些規則將細微變化引入多個點。

我的建議是:解決價值第一:

string id = user.id; // this has an implicit cast to string 
_facebookMembershipProvider.SetAuthCookie(id, false); 

應該很好地工作。你也可以使用:

_facebookMembershipProvider.SetAuthCookie((string)user.id, false); 

由於顯式類型轉換應該結束的說法表達的dynamic部分,所以調用是dynamic

+0

優秀的標誌。這解決了問題。非常感謝:) – 2012-03-23 10:02:45

+0

@JamieDixon所以用戶Id是一個'動態'對象? – Aliostad 2012-03-23 10:28:58

+0

是的。當Mark問我時,我會將它添加到評論中,並將其添加到問題中,以使未來的讀者更清楚。 – 2012-03-23 10:29:49