2016-03-15 135 views
0

有沒有辦法將對象字段複製到派生類構造函數中的基類,而無需單獨複製每個字段?在派生類構造函數中複製基類

例子:

public class A 
{ 
    int prop1 { get; set; } 
    int prop2 { get; set; } 
} 

public class B : A 
{ 
    public B(A a) 
    { 
     //base = a; doesn't work. 
     base.prop1 = a.prop1; 
     base.prop2 = a.prop2; 
    } 
} 

A a = new A(); 
B b = new B(a); 
+0

有沒有辦法了這一點。 –

回答

0

我不能爲我的生命明白你爲什麼要這麼做

你傳入Base類的一個實例爲派生類的構造函數。你想做什麼?

你試過this = a而不是base = a

+1

我想他試圖從A的一個實例開始,然後創建一個B的新實例。他希望B從A繼承的屬性由A實例上的值填充,但不想手動輸入他們出去分配他們。 –

+2

這是一個「複製構造函數」,並不少見。 –

0

成員是私人的,所以你甚至不能從派生類訪問它們。即使它們是protected,您仍然無法通過B類的A實例訪問它們。

爲了做到這一點沒有反映,會員必須是public:

public class A 
{ 
    public int prop1 { get; set; } 
    public int prop2 { get; set; } 
} 

// Define other methods and classes here 
public class B : A 
{ 
    public B(A a) 
    { 
     //base = a; doesn't work. 
     base.prop1 = a.prop1; 
     base.prop2 = a.prop2; 
    } 
} 
-1

如果你真的想這樣做,而不能訪問通過繼承的屬性,那麼你可以通過這樣的反思這樣做:

public class Aclass 
{ 
    public int Prop1 { get; set; } 
    public int Prop2 { get; set; } 
} 

public class Bclass : Aclass 
{ 
    public Bclass(Aclass aInstance) 
    { 
     CopyPropertiesFromAltInstance(aInstance); 
    } 

    public void CopyPropertiesFromAltInstance(Aclass aInstance) 
    { 
     PropertyInfo[] aProperties = aInstance.GetType().GetProperties(); 
     PropertyInfo[] myProperties = this.GetType().GetProperties(); 
     foreach (PropertyInfo aProperty in aProperties) 
     { 
      foreach (PropertyInfo myProperty in myProperties) 
      { 
       if (myProperty.Name == aProperty.Name && myProperty.PropertyType == aProperty.PropertyType) 
       { 
        myProperty.SetValue(this, aProperty.GetValue(aInstance)); 
       } 
      } 
     } 
    } 
} 
+0

你不能將'A'投射到'B'。 'A'是基類。 –

0
public class A 
{ 
    public A(A a) 
    { 
     prop1 = a.prop1; 
     prop2 = a.prop2; 
    } 

    int prop1 { get; set; } 
    int prop2 { get; set; } 
} 

public class B : A 
{ 

    public B(A a) : base (a) 
    { 

    } 
} 

A a = new A(); 
B b = new B(a); 

這樣的事情,雖然我不知道這是否是語法正確的,因爲我沒有編譯。您應該在子類的構造函數之後使用base關鍵字將它的依賴項的值傳遞給基類。

編輯:但我只是意識到你正在傳遞一個基類到一個子類。這是一個設計缺陷。

0

這聽起來像你想要從AB添加所有屬性,而無需單獨指定它們。如果你不想不斷地向構造函數中添加新的元素,你可以使用反射來爲你完成工作。

public B(A a) 
{ 
    var bType = this.GetType(); 

    // specify that we're only interested in public properties 
    var aProps = a.GetType().GetProperties(BindingFlags.Public | BindingFlags.Instance); 

    // iterate through all the public properties in A 
    foreach (var prop in aProps) 
    { 
     // for each A property, set the same B property to its value 
     bType.GetProperty(prop.Name).SetValue(this, prop.GetValue(a)); 
    } 
} 

關於這個的幾個注意事項:

  • 上述代碼設置公共實例屬性,所以你需要在A改變你的屬性是公共的。
  • 因爲你知道B包含A一切(因爲它是從它派生的),我只認爲這是安全的。
  • 如果您只有一些屬性,特別是如果它們不經常更改,只需單獨列出它們......您將更容易地看到您的代碼正在做什麼。
相關問題