从派生对象中提取基础对象

时间:2016-03-01 15:32:11

标签: c# entity-framework

我有一个班级A和一个班级B,它来自A。我有B的实例,即b,我想从中提取A部分。类似的东西:

var b = new B(); 
A a = (SomeCast)b;

捕获a.GetType()应该返回A输入B

是否可以在不创建A实例的情况下手动复制b中的所有字段和属性?

更新 问题的根源于实体框架,它不允许添加派生类型来代替基类型。我有一个biiig派生类型(我不允许添加注释)并且只想将基础部分添加到数据库中。

我很好奇,这是一个简单的答案。

2 个答案:

答案 0 :(得分:0)

如果B继承自A,那么B的所有实例都将是A的实例,A的所有字段和属性都可用于B的实例。

在您的代码中,您不需要进行投射,只需进行分配:

var b = new B();
A a = b;

但是不需要这样做,您可以使用b作为A的实例,而无需创建变量a

答案 1 :(得分:0)

免责声明:未来的丑陋代码

好吧,我冒着风险接受很多负面反馈,但让我们看看这是否是OP想要的。

正如大家已经告诉过你的那样,没有办法去除"剥离"派生到基类。所以我在这里提出的只是一个使用反射的黑客。

/// <summary>
/// Converts the mail message to memory stream. https://goo.gl/TrCqBu
/// </summary>
/// <param name="message">The message.</param>
/// <returns>MemoryStream.</returns>
public static MemoryStream ConvertMailMessageToMemoryStream(MailMessage message)
{
    Assembly assembly = typeof(SmtpClient).Assembly;
    Type mailWriterType = assembly.GetType("System.Net.Mail.MailWriter");
    MemoryStream fileStream = new MemoryStream();
    ConstructorInfo mailWriterContructor = mailWriterType.GetConstructor(BindingFlags.Instance | BindingFlags.NonPublic, null, new[] { typeof(Stream) }, null);
    object mailWriter = mailWriterContructor.Invoke(new object[] { fileStream });
    MethodInfo sendMethod = typeof(MailMessage).GetMethod("Send", BindingFlags.Instance | BindingFlags.NonPublic);

    if (sendMethod.GetParameters().Length == 2)
        sendMethod.Invoke(message, BindingFlags.Instance | BindingFlags.NonPublic, null, new[] { mailWriter, true }, null);
    else
        sendMethod.Invoke(message, BindingFlags.Instance | BindingFlags.NonPublic, null, new[] { mailWriter, true, true }, null);

    MethodInfo closeMethod = mailWriter.GetType().GetMethod("Close", BindingFlags.Instance | BindingFlags.NonPublic);
    closeMethod.Invoke(mailWriter, BindingFlags.Instance | BindingFlags.NonPublic, null, new object[] { }, null);
    return fileStream;
}

正如您所看到的,在B类中,我添加了一个新的Property,它使用类A中的新构造函数返回A的新实例。这个新构造函数循环基类中的所有属性并从派生类中获取值。

这就是它,我开放给公众私刑:)