现在,我正在研究ASP.NET MVC 2.我刚刚发现了一些关于View Model类的严重问题,它来自Model项目中的基类。每当我从数据库中获取数据时,我都必须将其转换为大多数OOP语言都无法实现的View Model实例。
基础课程
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 :(得分: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
最后,您是否可以更改数据访问层,以便它可以创建一个正确的类的实例来开始?