[英]C# Setting object parameters
如何設置一個對象的所有屬性等於另一個? 就像在我的示例中一樣,TCar基本上是一輛汽車,如何將共享變量設置為相等? 如果我沒記錯的話,在Java中,我可以輕松做到這一點。
class Car {
}
class TCar : Car {
}
Car car = new Car();
TCar datcar = new TCar();
datcar = car; Error? Isn't the datcar is a 'Car' too?
我不想手動設置所有內容。
您的代碼無效,因為Car
不是TCar
。 car = datcar
: car = datcar
。
但是,這可能無法實現您的期望,因為它只會使兩個引用 car
和datcar
指向同一個TCar
對象。
如果要將對象保留為單獨的對象,但要用另一個對象的屬性值更新一個對象的所有屬性,則必須一個個地分配它們。 或者,您可以使用自動完成此操作的AutoMapper 。
datacar
是Car
,但具體來說是TCar
因此無法設置對car
的引用,因為它們在內存中的類型不同。 此外,您正在執行的操作不會設置屬性值,它只會在內存中設置引用(或指針)。
您正在尋找的是Clone
到另一種類型。 考慮添加擴展方法來克隆該對象,如下所示:
namespace System
{
public static class Extensions
{
public static TOut Clone<TOut>(this Car input) where TOut : Car
{
var o = Activator.CreateInstance(typeof(TOut));
foreach (var prop in typeof(Car).GetProperties())
{
prop.SetValue(o, prop.GetValue(input));
}
}
}
}
因此,您現在可以執行以下操作:
TCar datacar = car.Clone<TCar>();
您可以使用另一個對象的屬性創建一個新對象:
Car car = new Car("jeep");
TCar datCar = new Tcar {
Brand = car.Brand
};
或者,您可以創建顯式/隱式運算符,或使用諸如AutoMapper的映射工具。
在C#中,您將需要轉換運算符 -並且在您提到的情況下,這將是隱式轉換。
從MSDN引用:“ C#使程序員可以在類或結構上聲明轉換,以便可以將類或結構與其他類或結構或基本類型進行相互轉換。它們將進行轉換。要轉換的參數的類型或轉換結果的類型(但不是兩者)必須是包含的類型。”
它看起來像這樣:
class Car
{
// ...other members
// User-defined conversion from TCar to Car
public static implicit operator Car(TCar d)
{
return new Car(d);
}
// User-defined conversion from Car to TCar
public static implicit operator TCar(Car d)
{
return new TCar(d);
}
}
來源: http : //msdn.microsoft.com/en-us/library/09479473(v=vs.90).aspx
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.