Reflection 在C#4.0中,从基类实例到派生类实例的最佳方式是什么?
现在,我正在开发ASP.NETMVC2。我刚刚发现了模型项目中从基类派生的视图模型类的一些严重问题。每次从数据库获取数据时,我都必须将其转换为视图模型实例,这在大多数OOP语言中是不可能的 基类Reflection 在C#4.0中,从基类实例到派生类实例的最佳方式是什么?,reflection,c#-4.0,Reflection,C# 4.0,现在,我正在开发ASP.NETMVC2。我刚刚发现了模型项目中从基类派生的视图模型类的一些严重问题。每次从数据库获取数据时,我都必须将其转换为视图模型实例,这在大多数OOP语言中是不可能的 基类 public class MyBaseClass { public string ID { get;set; } public string Value { get;set; } } public class MyDerivedClass : MyBaseClass, ISomeInt
public class MyBaseClass
{
public string ID { get;set; }
public string Value { get;set; }
}
public class MyDerivedClass : MyBaseClass, ISomeInterface
{
// logic for My Derived Class
}
派生类
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;
}
公共静态TDerived CastObject(TBase baseObj)
{
类型baseType=typeof(TBase);
类型derivedType=typeof(TDerived);
如果(!baseType.IsAssignableFrom(derivedType))
{
抛出新异常(“TBase必须是TDerived的父级”);
}
TDerived-derivedObj=Activator.CreateInstance();
foreach(baseType.GetProperties()中的PropertyInfo pi)
{
if(pi.CanRead)
{
PropertyInfo-derivedProperty=derivedType.GetProperty(pi.Name);
if(derivedProperty.CanWrite)
{
derivedProperty.SetValue(derivedObj,pi.GetValue(baseObj,null),null);
}
}
}
返回派生对象;
}
但我不确定上述代码是否能在大型网站上正常工作,而且C#4.0的DLR中有很多我不知道的功能
您对使用C#4.0转换项目有什么想法吗
谢谢,是否有任何原因使基类型不能有一个构造函数,该构造函数从实例中复制数据
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
最后,,您可以更改数据访问层,以便它可以创建正确类的实例吗?您可以解释为什么要将所有值复制到派生类中?因为我有其他代码检查实例类型是否有接口,并且我无法修改基类,因为它是生成代码的一部分。这非常简单正如你所回答的。但它不起作用,因为基类是由VS 2010 B2上EF 4.0的POCO模板生成的。@Soul_Master:它是作为部分类生成的吗?如果是这样,您可以在另一个文件中添加自己的构造函数。这应该是一个非常糟糕的主意。因为当生成的类中的属性发生更改时,也必须更改分部类中的构造函数。这对我来说没有意义。我认为我目前的解决方案应该比你的解决方案更适用于大型项目。在我看来,从这个要求开始听起来不是一个好主意。是的,你需要小心“复制构造函数”的想法——但我认为我更喜欢它而不是反射。见鬼,您可以轻松地自动生成包含构造函数的文件——这样,它在面对更改时会非常健壮,但不会有反射的缺点。