[英]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.