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

时间:2009-12-30 08:42:35

标签: reflection c#-4.0

现在,我正在研究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转换项目的想法?

谢谢,

1 个答案:

答案 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

最后,您是否可以更改数据访问层,以便它可以创建一个正确的类的实例来开始?