铸造良好的做法

时间:2010-04-06 07:52:10

标签: c# casting

我有3个班级

namespace ServerPart
{

    public class Car
    {
    }

    public class SUV:Car
    {
        public string Name {get;set;}    
        public string Color {get;set;)
    }
}

并且

namespace WebSericePart
{
    public class Car
    {
    }
}

namespace WebSericePart.Car
{
    public class SUV
    {
        public string Name {get;set;}

        public string Color {get;set;)
    }
}

我是翻译

namespace WebServicepart.Translators
{
    public static class ModelToContract
    {
        public Car[] ToCars(ServerPart.Car[] modelCars)
        {
            List<Car> contractCars=new List<Car>();
            foreach(ServerPart.Car modelCar in modelCars)
            {
                contractCars.Add(ToCar(modelCar);
            }
            return contractCars.ToArray();
        }

        public Car ToCar(ServerPart.Car modelCar)
        {
            if(modelCar is ServerPart.SUV)
            {
                return ToSUV(modelCar);
            }
            else
            {
                throw new NotImplementedException("Not supported type of Car");
            }
        }

        public Car ToSUV(ServerPart.Car modelCar)
        {
            SUV suv = new SUV();

            suv.Name=((ServerPart.SUV)modelCar).Name;
            suv.Color=((ServerPart.SUV)modelCar).Color;

            // ?? Is good practice ?? Or 
            //ServerPart.SUV  suv=(ServerPart.SUV)modelCar
            //suv.Name=suv.Name
            //suv.Color=suv.Color
            // is better ??

            return suv;
        }
    }
}

我是否使用过其他一些不好的做法?或者一切都好:)?

4 个答案:

答案 0 :(得分:1)

使用内联属性((Type)object).Property进行内联属性没有任何问题。

我更喜欢第二种方法,因为你减少了重复的代码。如果稍后添加一些属性,则不必继续复制强制转换代码。

答案 1 :(得分:1)

如果您可以修改ServerPart,请避免强制转换,使用访问者模式。

答案 2 :(得分:0)

我实际上更喜欢第二种选择。我认为它最可读,更好,更容易调试。 也许你缺少一个空检查,但也许它不是必要的,因为它永远不会发生。

无论如何,我认为两者都可以。

答案 3 :(得分:0)

这不是一个转换问题,但一般来说,在C#中返回数组并不是一个好主意:

public Car[] ToCars(ServerPart.Car[] modelCars)

请参阅Eric Lippert的优秀文章Array's Considered Somewhat Harmful

因为在内部,Car对象存储在列表中,所以尤其如此。如果调用ToCars的方法只需要获取一系列Cars,则可以使用IEnumerable<Cars>(参见下文)。其他接口也可以向呼叫者授予其他访问权限 - 请参阅ICollection<T>IList<T>

public IEnumerable<Car> ToCars(IEnumerable<ServerPart.Car> modelCars)
{
  List<Car> contractCars=new List<Car>(); 
  foreach(ServerPart.Car modelCar in modelCars) 
  { 
    contractCars.Add(ToCar(modelCar); 
  } 
  return (IEnumerable<Car>)contractCars;
}