Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Reflection 在C#4.0中,从基类实例到派生类实例的最佳方式是什么?_Reflection_C# 4.0 - Fatal编程技术网

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

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

现在,我正在开发ASP.NETMVC2。我刚刚发现了模型项目中从基类派生的视图模型类的一些严重问题。每次从数据库获取数据时,我都必须将其转换为视图模型实例,这在大多数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 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:它是作为部分类生成的吗?如果是这样,您可以在另一个文件中添加自己的构造函数。这应该是一个非常糟糕的主意。因为当生成的类中的属性发生更改时,也必须更改分部类中的构造函数。这对我来说没有意义。我认为我目前的解决方案应该比你的解决方案更适用于大型项目。在我看来,从这个要求开始听起来不是一个好主意。是的,你需要小心“复制构造函数”的想法——但我认为我更喜欢它而不是反射。见鬼,您可以轻松地自动生成包含构造函数的文件——这样,它在面对更改时会非常健壮,但不会有反射的缺点。