覆盖值c#

时间:2016-01-29 10:11:27

标签: c# .net performance reflection

我有一种情况,我在下面有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我们可以看出,b / w 3 classes几乎没有共同属性。

我遇到这种情况,我需要通过组合3 classes中的值来创建最终输出,并在低classes时将值覆盖。

例如: -

考虑属性所有3 classes ABC的属性,但如果C中的值不是null虽然合并class C中的值具有优先权,但所有属性都是如此。

我已经使用 Reflection ,通过使用classes和{{读取我拥有的所有3个.GetType()的实例中的值来实现此目的1}}属于.GetProperties()库的方法。

使用当前System.Reflection方法,我将能够处理任何Reflection based中的任何属性。

但我读过classes表现不佳。

那么有更好的方法吗?

3 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

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

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