我有一个班级A
和一个班级B
,它来自A
。我有B
的实例,即b
,我想从中提取A
部分。类似的东西:
var b = new B();
A a = (SomeCast)b;
捕获a.GetType()
应该返回A
输入B
。
是否可以在不创建A
实例的情况下手动复制b
中的所有字段和属性?
更新 问题的根源于实体框架,它不允许添加派生类型来代替基类型。我有一个biiig派生类型(我不允许添加注释)并且只想将基础部分添加到数据库中。
我很好奇,这是一个简单的答案。
答案 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的新实例。这个新构造函数循环基类中的所有属性并从派生类中获取值。
这就是它,我开放给公众私刑:)