C# 实体中的泛型字段类型



我有几个字段的类:

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; }
}

最新更新