【问题标题】:C# Setting object parametersC# 设置对象参数
【发布时间】:2013-11-12 20:10:41
【问题描述】:

如何将一个对象的所有属性设置为与另一个对象相等?就像在我的例子中一样,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?

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

【问题讨论】:

  • 您可以像这样定义TCar 的构造函数:public TCar(Car car) 并适当地分配匹配字段。

标签: c# object inheritance equation


【解决方案1】:

您的代码将不起作用,因为 Car 不是 TCar。反之亦然:car = datcar。

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 我不是很想添加功能,因为我在.net mvc4 web项目中使用我的类作为模型,但这是一个很好的解决问题的方法,谢谢,我会保留请注意这一点。
    【解决方案3】:

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

    Car car = new Car("jeep");
    
    TCar datCar = new Tcar {
     Brand = car.Brand
    };
    

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

    【讨论】:

      【解决方案4】:

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

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

      看起来像这样:

      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

      【讨论】:

        猜你喜欢
        • 2016-01-25
        • 2021-01-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-03-23
        相关资源
        最近更新 更多