2009-12-30 118 views
0

现在,我正在研究ASP.NET MVC 2.我刚刚发现了一些有关从Model项目中的基类派生的View Model类的严重问题。每当我从数据库获取数据时,我都必须将其转换为View Model实例,而这在大多数OOP语言中是不可能的。在C#4.0中,基类实例派生类实例的最佳方式是什么?

基类

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,我不知道很多功能。

你对使用C#4.0转换项目有任何想法吗?

感谢,

+0

您可能会解释为什么要将所有值复制到派生类? – Bobby 2009-12-30 08:52:44

+0

因为我有其他代码检查实例类型是否有一些接口,我不能修改基类,因为它是生成的代码的一部分。 – 2009-12-30 11:08:17

回答

1

有什么理由基本类型不能有历时一个实例中复制数据的构造?

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?

最后,你能否改变数据访问层,以便它可以创建一个正确的类的实例开始?

+0

答案很简单。但它不起作用,因为基类是由VS 2010 B2上的EF 4.0的POCO模板生成的。 – 2009-12-30 11:09:45

+0

@Soul_Master:它是否生成为部分类?如果是这样,你可以在另一个文件中添加自己的构造函数。 – 2009-12-30 12:05:21

+0

这应该是非常糟糕的主意。因为当生成的类中的属性发生更改时,您必须在部分类中更改构造函数。这对我来说没有意义。我认为我现在的解决方案应该适用于大型项目,而不是解决方案。 – 2009-12-30 22:02:12

相关问题