代码之家  ›  专栏  ›  技术社区  ›  Soul_Master

在C#4.0中,从基类实例到派生类实例的最佳方法是什么?

  •  0
  • Soul_Master  · 技术社区  · 16 年前

    现在,我正在努力ASP.NETMVC 2。我刚在模型项目中发现了一些关于从基类派生的视图模型类的严重问题。每次从数据库中获取数据时,我都必须将其转换为视图模型实例,这在大多数OOP语言中是不可能的。

    基类

    public class MyBaseClass
    {
        public string ID { get;set; }
        public string Value { get;set; }
    }
    

    派生类

    public class MyDerivedClass : MyBaseClass, ISomeInterface
    {
        // logic for My Derived Class
    }
    

    但是,我尝试创建一些方法,将所有可读属性从基类的实例复制到派生类的实例,如下面的代码所示。

    public static TDerived CastObject<TBase, TDerived>(TBase baseObj)
    {
        Type baseType = typeof(TBase);
        Type derivedType = typeof(TDerived);
    
        if (!baseType.IsAssignableFrom(derivedType))
        {
            throw new Exception("TBase must be a parent of TDerived.");
        }
    
        TDerived derivedObj = Activator.CreateInstance<TDerived>();
    
        foreach (PropertyInfo pi in baseType.GetProperties())
        {
            if (pi.CanRead)
            {
                PropertyInfo derivedProperty = derivedType.GetProperty(pi.Name);
    
                if (derivedProperty.CanWrite)
                {
                    derivedProperty.SetValue(derivedObj, pi.GetValue(baseObj, null), null);
                }
            }
        }
    
        return derivedObj;
    }
    

    但是我不确定上面的代码是否能在大型网站上很好地工作,而且在C#4.0的DLR中有很多我不知道的特性。

    谢谢,

    1 回复  |  直到 16 年前
        1
  •  1
  •   Jon Skeet    16 年前

    基类型不能有从中复制数据的实例的构造函数有什么原因吗?

    public class MyBaseClass
    {
        public string ID { get;set; }
        public string Value { get;set; }
    
        public MyBaseClass() {}
    
        public MyBaseClass(MyBaseClass other)
        {
            ID = other.ID;
            Value = other.Value;
        }
    }
    
    
    public class MyDerivedClass : MyBaseClass, ISomeInterface
    {
        public MyDerivedClass(MyBaseClass other) : base(other)
        {           
        }
    }
    

    或者,你可以用组合而不是继承来实现这一点吗?派生类是否可以保留对的实例的引用 MyBaseClass 从中获取它的值和ID?