2014-01-26 45 views
1

我有,我創建了一個顯式接口的問題,我得到異常,聲明顯式接口和不包含定義錯誤C#

「X」不包含「Y的定義'並且沒有擴展方法'y'接受類型'x'的第一個參數可以被發現

我有一系列的類。基類:

public interface IFactoryResponse 
{ 
    object instance { get; set; } 
    string instanceconfig { get; set; } 
} 

明確地實現它的類:

public class FactoryResponseImpl : IFactoryResponse 
{ 
    object IFactoryResponse.instance { 
     get { return ((IFactoryResponse)this).instance; } 
     set { ((IFactoryResponse)this).instance = value; } 
    } 

    string IFactoryResponse.instanceconfig { 
     get { return ((IFactoryResponse)this).instanceconfig; } 
     set { ((IFactoryResponse)this).instanceconfig = value; } 
    } 
} 

,並在另一個類,我得到上述錯誤。 Visual Studio可以找到界面和類,但它無法解析實例屬性。我在這裏錯過了什麼。我可能會錯過顯式繼承的更精煉的規則之一。

if (facconfig.useabstract) { 
    response.instance = Activator.CreateInstance(m_entassembly.GetType(entconfig.Classname, true, true)); 
    response.instanceconfig = facconfig.config; 
} else { 
    Assembly assem = Assembly.LoadFrom(facconfig.assemblyfile); 
    object Obj = Activator.CreateInstance(assem.GetType(facconfig.Classname, true, true)); 
    response.instance = Obj; 
    response.instanceconfig = facconfig.config; 
} 
+0

接口是否在同一個程序集中定義? –

+0

它確實在同一個程序集 – SoftwareSavant

+0

中定義,你需要將該對象作爲該接口進行強制轉換,然後才能看到屬性 –

回答

3
  1. 你的實現是不正確。它會導致StackOverflowException,因爲屬性自己調用。您可以使用autoproperties輕鬆實現屬性:

    public class FactoryResponseImpl : IFactoryResponse 
    { 
        object IFactoryResponse.instance { get; set; } 
    
        string IFactoryResponse.instanceconfig { get; set; } 
    } 
    
  2. 當接口成員明確實現你的接口,通過鑄造你的類實例到該接口或者將其分配到一個變量類型,看看變量該界面。

    if (facconfig.useabstract) { 
        ((IFactoryResponse)response).instance = Activator.CreateInstance(m_entassembly.GetType(entconfig.Classname, true, true)); 
        ((IFactoryResponse)response).instanceconfig = facconfig.config; 
    } else { 
        Assembly assem = Assembly.LoadFrom(facconfig.assemblyfile); 
        object Obj = Activator.CreateInstance(assem.GetType(facconfig.Classname, true, true)); 
        ((IFactoryResponse)response).instance = Obj; 
        ((IFactoryResponse)response).instanceconfig = facconfig.config; 
    } 
    
  3. 爲什麼你需要明確實現的接口?除非你有很好的理由,否則你不應該那樣做。使用隱式執行一切要容易得多:

    public class FactoryResponseImpl : IFactoryResponse 
    { 
        public object instance { get; set; } 
    
        public string instanceconfig { get; set; } 
    } 
    

    和你的其他代碼應該只是罰款。

+0

這是一個非常好的答案。每當我想我知道我需要知道的一切時,我就會遇到這樣的問題。我需要更多一點,但我認爲你的答案是最好的。我只是要消除顯式接口實現。 – SoftwareSavant

0

您的顯式實現引用了它們自己。你應該引用一個私人領域或公共實現。例如: -

public class FactoryResponseImpl : IFactoryResponse 
{ 
    DatabaseFactoryResponseInstance _instance; 

    public FactoryResponseImpl() 
    { 
     _instance = new DatabaseFactoryResponseInstance(); 
    } 

    object IFactoryResponse.instance { 
    get { return (object)_instance; } 
    set { 
      if (value != null) 
      { 
       DatabaseFactoryResponseInstance dbInstance; 
       dbInstance = value as DatabaseFactoryResponseInstance; 
       if (dbInstance == null) 
        throw new InvalidOperationException(); 

       _instance = dbInstance; 
      } 
     } 
} 
+0

DatabaseFactoryResponseInstance從哪裏來? – SoftwareSavant

+0

這是「實例」的一種可能的實現。 –

+0

杜,傻逼我。我以爲我錯過了一些東西。 – SoftwareSavant

0

這是你在哪裏瞄準?

public interface IFactoryResponse 
     { 
      object instance { get; set; } 
      string instanceconfig { get; set; } 
     } 

     public class FactoryResponseImpl : IFactoryResponse 
     { 
      object IFactoryResponse.instance { get; set; } 
      string IFactoryResponse.instanceconfig { get; set; } 
     } 

     class Test 
     { 
      public void TestMethod() 
      { 

       IFactoryResponse response = new FactoryResponseImpl(); 
       response.instance = null; 
      } 
     } 
0

如果使用顯式接口實現,如IFactoryResponse.instance,那麼這些方法是不公開可見的。要麼你需要轉換爲IFactoryResponse來訪問它們或將方法定義爲public:public object instance {...}。