2011-08-17 36 views
2

我想強烈鍵入一個對象屬性已被定義爲接口中的接口。這裏是我的樣品如何強制鍵入已定義爲接口的屬性?

// interfaces 
public interface IMyInterfaceA 
{ 
    string A { get; set; } 
    IMyInterfaceB B { get; set; } 
} 

public interface IMyInterfaceB 
{ 
    string B { get; set; } 
} 

// POCOs 
public class pocoOneB : IMyInterfaceB 
{ 
    public B { get; set; } 
    public C { get; set; } // extending the poco with a non-interfaced property 
} 

public class pocoOneA : IMyInterfaceA 
{ 
    string A { get; set; } 
    pocoOneB B { get; set; } // fails, can I strongly type an interface?? 
} 

public class pocoTwoB : IMyInterfaceB 
{ 
    public B { get; set; } 
    public D { get; set; } // extending the poco with a non-interfaced property 
} 

public class pocoTwoA : IMyInterfaceA 
{ 
    string A { get; set; } 
    pocoTwoB B { get; set; } // fails, can I strongly type an interface?? 
} 

問題是我不能做

pocoOneB B { get; set; } // fails, can I strongly type an interface?? 

pocoTwoB B { get; set; } // fails, can I strongly type an interface?? 

即使他們是接口的實現,編譯器說,我沒有在poco上正確實現IMyInterfaceA。我理解錯誤,但是我想知道是否有強制鍵入具有接口的屬性的方法?

解決此問題的一種方法是不具有接口IMyInterfaceA定義接口IMyInterfaceB屬性的所有和範圍在poco的,但我試圖執行該屬性是使用接口實現的。

我需要強烈鍵入poco屬性的主要原因是因爲我使用JSON來消滅線。

感謝您的任何指導。

+0

你得到的錯誤信息是什麼? –

+0

不知道這是否會有所幫助,但如果在類定義中右鍵單擊接口,則可以選擇實現接口明確性。這將接口的屬性和方法定義爲interface.property,可能值得一看 – WraithNath

回答

2
public interface IMyInterfaceA<TPoco> 
    where TPoco : IMyInterfaceB 
{  
    TPoco B { get; set; } 
} 

public class pocoOneA<TPoco> : IMyInterfaceA<TPoco> 
    where TPoco : IMyInterfaceB 
{  
    public TPoco B { get; set; } // fails, can I strongly type an interface?? 
} 

或者乾脆

public interface IMyInterfaceA 
{  
    IMyInterfaceB B { get; set; } 
} 

public class pocoOneA : IMyInterfaceA 
{  
    public IMyInterfaceB B { get; set; } // fails, can I strongly type an interface?? 
} 
+0

@dlev:因爲我忘記更新接口定義了? (已更新)。或者你看到的其他問題?前者爲 – sll

+0

。現在看起來很好。 – dlev

+0

@dlev:好的,謝謝指出! – sll

1
public interface IMyInterfaceA 
{ 
    string A { get; set; } 
    IMyInterfaceB B { get; set; } 
} 

你的接口有IMyInterfaceB B,所以你必須在類相同的簽名。

public class pocoOneA : IMyInterfaceA 
{ 
    string A { get; set; } 
    IMyInterfaceB B { get; set; } // fails, can I strongly type an interface?? 
} 

但是,當你返回你可以返回pocoOneB或pocoTwoB

對象
+0

這是我試圖避免的,將屬性定義爲'IMyInterfaceB B',因爲如果我嘗試使用JSON進行消滅,序列化程序不知道使用哪個poco。這就是爲什麼我要強烈地鍵入我的poco的有一個屬​​性上定義的接口。 –

+0

使用泛型參數(請參閱我的答案),您可以實例化它傳遞混凝土類型,如新的PocoA (pocoBInstance);所以反序列化器會知道哪種類型使用pocoB的實例(您使用它沒有泛型參數的事件,因爲任何方式pocoA都有pocoB的實例)。爲了更清楚我需要看看你是如何反序列化這些pocos的? – sll

0

你不應該需要「強類型」屬性 - 接口IMyInterfaceB應提供所需要的消費者的所有信息與IMyInterfaceA合作。你可以做的是回到你的財產與類型的實例MyInterfaceB

private MyInterfaceB _myInterfaceB; 

public IMyInterfaceB 
{ 
    get { return _myInterfaceB; } 
    set { _myInterfaceB = (MyInterfaceB)value; } 
} 
0

你想要的是協變返回類型。 IIRC從來沒有將它變成C# - 至少在這種形式下。

您可以通過顯式實現接口並在派生類型中爲強類型返回值提供新屬性來模擬它。不過,我不確定這是如何與你的序列化一起玩的。

// interfaces 
public interface IMyInterfaceA 
{ 
    string A { get; set; } 
    IMyInterfaceB B { get; set; } 
} 

public interface IMyInterfaceB 
{ 
    string B { get; set; } 
} 

// POCOs 
public class pocoOneB : IMyInterfaceB 
{ 
    public string B { get; set; } 
    public string C { get; set; } // extending the poco with a non-interfaced property 
} 

public class pocoOneA : IMyInterfaceA 
{ 
    public string A { get; set; } 
    IMyInterfaceB IMyInterfaceA.B{ get; set; } 
    public pocoOneB B { get{ return new pocoOneB(); } set{} } // fails, can I strongly type an interface?? 
} 

public class pocoTwoB : IMyInterfaceB 
{ 
    public string B { get; set; } 
    public string D { get; set; } // extending the poco with a non-interfaced property 
} 

public class pocoTwoA : IMyInterfaceA 
{ 
    public string A { get; set; } 
    IMyInterfaceB IMyInterfaceA.B{ get; set; } 
    public pocoOneB B { get{ return new pocoOneB(); } set{} } // fails, can I strongly type an interface?? 
} 
相關問題