2015-11-03 235 views
1

我有兩個不同的類定義C1和C2,它們都有一個名爲 的屬性DateTime Start;在C#中使用泛型創建類似類型的實例

所以

public partial class C1 
{ 
    public DateTime Start; 
} 
public partial class C2 
{ 
    public DateTime Start; 
} 

因爲這兩個類是有幾分相像,我想一個聰明的方式來創建這些類的實例,我在想,如果有可能給它返回一個泛型方法相結合上述類與分配的起始屬性的一個實例: 我想的是一樣的東西:

public T GetClassInstance<T>(DateTime start) where T : new() 
{ 
    T time = new T(); 
    time.Start = start; 
    return time; 
} 

但上面給出了一個編譯錯誤,因爲沒有定義T.Start。

我知道我可以添加約束但唯一無二一類:

public T GetClassInstance<T>(DateTime start) where T : C1, new() 

但我得到一個編譯錯誤,如果我增加更多的類存在。

而且我不能重新定義我的類來實現一個共同的接口,因爲它們是從我不可以編輯

任何建議,以一個聰明的辦法,我可以實現上述的XSD生成的?

感謝 Jeeji

+1

定義與所述公共部件的接口,並使用它。 – Jon

+0

你可以在兩種類型中實現通用接口嗎?如果沒有,只要使用'動態'(雖然我不是它的粉絲) –

+0

我將如何使用'動態'? –

回答

1

使用的界面,爲他人suggesed。生成的類通常是一個部分類,在你的情況下它是部分的嗎?因此,您可以在部分部分添加接口實現,而不是在生成的代碼中。

下面是一個例子:

public partial class C1 
{ 
    public DateTime Time { get; set; } 
} 
public partial class C2 
{ 
    public DateTime Time { get; set; } 
} 

public interface IClass 
{ 
    DateTime Time { get; set; } 
} 

public partial class C1 : IClass { } 
public partial class C2 : IClass { } 

static T SetTime<T>(DateTime time) where T: IClass, new() 
{ 
    var t = new T(); 
    t.Time = DateTime.Now; 
    return t; 
} 
+0

正確,但可能會從示例中受益。 – Greg

+0

是完美的。我編輯了我的上面的問題,包括類是部分的。 –

1

定義一個接口

public interface IHasStartTime // please think of a more descriptive name! 
{ 
    DateTime Start {get;set;} 
} 

實現它在兩個C1C2,並使用它作爲您的約束

public T GetClassInstance<T>(DateTime start) where T : IHasStartTime, new() 
+0

不幸的是我無法重新實現這些類。它們是由我無法控制的XSD生成的。 –

+0

這些類型的生成器通常會生成一個「partial」類,這意味着您可以創建另一個「partial」文件,其中包含您的接口實現。 – Jamiec