2010-08-13 105 views
10

有沒有辦法根據這些方法做些什麼?沒有靜態類型的C#接口

interface Iface 
{ 
    [anytype] Prop1 { get; } 
    [anytype] Prop2 { get; } 
} 

class Class1 : Iface 
{ 
    public string Prop1 { get; } 
    public int Prop2 { get; } 
} 

class Class2 : Iface 
{ 
    public int Prop1 { get; } 
    public bool? Prop2 { get; } 
} 

我不關心屬性的類型,我只需要屬性可用。這不一定要用接口來實現,只是以此爲例。

回答

25

使界面通用:

interface Iface<T1,T2> 
{ 
    T1 Prop1 { get; } 
    T2 Prop2 { get; } 
} 

或者,讓object類型的屬性:

interface Iface 
{ 
    object Prop1 { get; } 
    object Prop2 { get; } 
} 

如果你使用.NET 4.0,你可以甚至使dynamic類型的屬性:

interface Iface { 
    dynamic Prop1 { get; } 
    dynamic Prop2 { get; } 
} 
+0

這些都不會真正實現什麼被要求有一個很好的理由。 Iface 不等於Iface 。 – Lazarus 2010-08-13 15:03:10

+0

@Lazarus:如果OP希望不同的類實現*相同的接口*,但允許字段根據類型而變化,那麼只有第二個和第三個選項支持該類型。但是,如果OP正在尋找一種方法來簡單地聲明具有某些名稱的屬性(並忽略該類型),那麼它仍然可以用於某種目的。總的來說,對於接口來說,這是一個不尋常的要求。 – LBushkin 2010-08-13 15:14:46

+0

'動態'版本不需要是通用的。 – Trillian 2010-08-13 15:32:40

5

使用object或通用Iface<TValue1,TValue2>

1

,與其擊敗接口的目標,將違反C#的嚴格打字,甚至沒有一個動態的,將有助於你在那裏我害怕。答案是否定的,我相信。

1

不是真的,但你可以這樣做:

interface Iface<TType1, TType2> 
{ 
    TType1 Prop1 { get; } 
    TType2 Prop2 { get; } 
} 

然而,然後Iface<string, int>IFace<int, bool?>將是截然不同的類型。 (即,您的Class1 & Class2將不具有通用接口)

3

您將不得不使用對象或提供通用接口。

的通用版本會是什麼樣子:

interface IFace<T1, T2> 
{ 
    T1 Prop1 { get; } 
    T2 Prop1 { get; } 
} 

這會讓執行類型給予任何類型的,它希望這些屬性,但不足之處是,每當你接受的界面,你需要指定這兩種類型:

public void DoSomething(IFace<int, string> sadFace) 
... 

這通常是有問題的,非常限制性至少,也可以通過給接口的基座界面其中兩個屬性可與object返回類型「解決」。

我認爲最好的辦法,短期重新考慮你的方法是定義一個接口IFACE:

interface IFace 
{ 
    object Prop1 { get; } 
    object Prop1 { get; } 
} 

然後在你的類實現接口明確像這樣:

class MyClass: IFace 
{ 
    public string Prop1 { get; } 
    public int Prop2 { get; } 

    object IFace.Prop1 { get; } 
    object IFace.Prop1 { get; } 
} 

這將允許知道對象是MyClass類型的用戶通過其實際類型引用Prop1Prop2,並且使用IFace的任何內容都可以使用p返回類型爲object的roperties。

我自己我已經使用了一些看起來像最後一段代碼的東西,甚至是上面的「基本接口的通用接口」版本,但這是一個非常特殊的場景,我不知道我是否可以解決它以任何其他方式。

1

我不知道你的使用場景,但你可以通過明確的實現接口來做到這一點。注意:您當前的實現無法爲這些屬性分配值,因此您可能希望將私有或受保護的集訪問器添加到類屬性中。

interface Iface 
{ 
    object Prop1 { get; } 
    object Prop2 { get; } 
} 

class Class1 : Iface 
{ 
    public string Prop1 { get; } 
    public int Prop2 { get; } 

    object Iface.Prop1 
    { 
     get { return Prop1; } 
    } 

    object Iface.Prop2 
    { 
     get { return Prop2; } 
    }  
} 

class Class2 : Iface 
{ 
    public int Prop1 { get; } 
    public bool? Prop2 { get; } 

    object Iface.Prop1 
    { 
     get { return Prop1; } 
    } 

    object Iface.Prop2 
    { 
     get { return Prop2; } 
    } 
} 
1

使用對象。 如果您可以提供正在使用的場景,人們可以提供更好的答案。