在C#中使用泛型创建类似类型的实例

问题描述:

我有两个不同的类定义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

我将如何使用'动态'? –

使用的界面,为他人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

是完美的。我编辑了我的上面的问题,包括类是部分的。 –

定义一个接口

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