C#设置对象参数

时间:2013-11-12 20:10:42

标签: c# object inheritance equation

如何将对象的所有属性设置为等于另一个?就像在我的例子中,TCar基本上是一个Car,我怎样才能将共享变量设置为相等?在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?

我不想手动设置所有内容。

4 个答案:

答案 0 :(得分:5)

您的代码无效,因为Car不是TCar。另一种方法是:car = datcar

但是,这可能不会达到您的预期,因为它只会使两个引用 cardatcar指向同一个TCar对象。 / p>

如果要将对象保持为单独的对象,但是使用另一个对象属性的值更新一个对象的所有属性,则必须逐个分配它们。或者您可以使用AutoMapper自动执行此操作。

答案 1 :(得分:4)

datacarCar,但它特别是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>();

答案 2 :(得分:3)

您可以使用另一个属性创建一个新对象:

Car car = new Car("jeep");

TCar datCar = new Tcar {
 Brand = car.Brand
};

或者您可以创建显式/隐式运算符或使用AutoMapper等映射工具。

答案 3 :(得分:0)

在C#中,您需要转换运算符 - 并且,在您提到的情况下,它将是隐式转换。

从MSDN引用:&#34; C#使程序员能够在类或结构上声明转换,以便类或结构可以转换为和/或从其他类或结构或基本类型转换。转换定义为运算符,并以它们转换的类型命名。要转换的参数类型或转换结果的类型(但不是两者)都必须是包含类型。&#34;

它看起来像这样:

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