Overriding values c#

本文关键字:values Overriding | 更新日期: 2023-09-27 18:32:28

我有一个情况,我有 3 个classes如下所示:

public class A
{
    public int Id { get; set; }
    public int BranchId { get; set; }
    public int LocationId { get; set; }
    public int DepID { get; set; }
    public int Age { get; set; }
    public string Name { get; set; }
}
public class B
{
    public int LocationId { get; set; }
    public int DepID { get; set; }
    public int Age { get; set; }
    public string Name { get; set; }
}  
public class C
{
    public int Age { get; set; }
    public string Name { get; set; }
}

从上面的classes我们看到,黑白 3 classes的共同属性很少。

遇到一种情况,我必须通过组合 3 个classes的值来创建最终输出,并在存在时覆盖它们,并在较低classes中覆盖它们。

例如:-

考虑属性年龄,它是所有 3 classes ABC 但是如果它在 C 中的值不null,而合并 class C 中的值优先,所有属性都是这种情况。

我已经使用 Reflection 来实现了这一点,通过使用.GetType().GetProperties()方法从我拥有的所有 3 个classes的实例中读取值,这些方法都是System.Reflection库的一部分。

使用当前的Reflection based方法,我将能够在任何classes中处理任何属性的添加。

但我读到Reflection性能不佳。

那么有没有更好的方法呢?

Overriding values c#

您需要查看继承。您的数据结构应如下所示:

public class C
{
    public int Age { get; set; }
    public string Name { get; set; }
}
public class B : C
{
    public int LocationId { get; set; }
    public int DepID { get; set; }
}  
public class A : B
{
    public int Id { get; set; }
    public int BranchId { get; set; }
}

您只需创建正确类型的对象,每个对象都有其所需的属性,但不会获得重复的属性。

您可以使用继承将公共属性向下推送到基类,然后从它们派生以创建其他属性,例如:

public class A : B
{
    public int Id { get; set; }
    public int BranchId { get; set; }
}
public class B : C
{
    public int LocationId { get; set; }
    public int DepID { get; set; }
}  
public class C
{
    public int Age { get; set; }
    public string Name { get; set; }
}

接口可用于标识属性组。此方法不会强制您更改已建立的类层次结构。

 interface IData1
 {
     int Id { get;set; }
     int BranchId { get;set; }
 }
 interface IData2 
 {
     int LocationId { get;set; }
     int DepID { get;set; }
 }
 interface IData3
 {
      int Age { get;set; }
      string Name { get;set; }
 }

 public class A : IData1, IData2, IData3
 {
      public int Id { get;set; }
      public int BranchId { get;set; }
      public int LocationId { get;set; }
      public int DepID { get;set; }
      public int Age { get;set; }
      public string Name { get;set; }
 }
 public class B : IData2, IData3
 {
     public int LocationId { get;set; }
     public int DepID { get;set; }
     public int Age { get;set; }
     public string Name { get;set; }
 }
 public class C : IData3
 {
     public int Age { get;set; }
     public string Name { get;set; }
  }
 void WriteData1(IData1 data){}
 void WriteData2(IData2 data){}
 void WriteData3(IData3 data){}
 void WriteProperties(A a, B b, C c)
 {
       WriteData1(a);
       WriteData2(a);
       WriteData2(b);
       WriteData3(a);
       WriteData3(b);
       WriteData3(c); 
  }