我有几个字段的类:
class Entity{
public int field1 {get; set;}
public int field2 {get; set;}
public int field3 {get; set;}
}
但是,我希望能够将此类与其他类型重用:字符串或布尔值。但是编译器不喜欢我用公共 T 字段 1 {get; set;} 替换公共 int field1 {get; set;}实现这一目标的最佳方法是什么?
你需要一个关于你的类型的泛型参数,如下所示:
class Entity<T> {
public T field1 {get; set;}
public T field2 {get; set;}
public T field3 {get; set;}
}
然后,您可以像这样重复使用它:
class EntityOfInt : Entity<int> {
///field1 is an int
///field2 is an int
///field3 is an int
}
在 .NET 4 及更高版本中,您可以使用动态
class Entity {
public dynamic field1 {get; set;}
public dynamic field2 {get; set;}
public dynamic field3 {get; set;}
}
可能的覆盖
class Foo : Entity {
public new string field1 {get; set;}
public new int field2 {get; set;}
//field3 is still dynamic
}
这样,您仍然可以对这两种类型进行装箱和取消装箱,并公开您的字段。如果不重写,它们将保持动态。因此,您可以拥有简单的类语法,并且可以在一个类中使用多个不受约束的模板。
使用通用模板的上述类
class Entity<T1,T2,T3>
where T3: new()
{
public T1 field1 {get; set;}
public T2 field2 {get; set;}
public T3 field3 {get; set;}
}
如您所见,这很快就会失控,
但请记住,作为带有 class Entity<T>
的方法,这不是类型安全的,因为动态字段将接受所有类型,并覆盖以前使用过的方法。每次要将其用作对象时,您都必须将其拆箱。
有关详细信息,请参阅 MSDN
MSDN
可以使用多个泛型类型:
public class Entity<T1, T2, T3, T4>
{
public virtual T1 Field1 {get;set;}
public T2 Field2 { get; set; }
public T3 Field3 { get; set; }
public T4 Field4 { get; set; }
}
public class Derived : Entity<int, string, bool, int>
{
public override int Field1 { get; set; }
}