C# 使用子类中该类的实例初始化父类的成员
我有以下课程:C# 使用子类中该类的实例初始化父类的成员,c#,oop,inheritance,C#,Oop,Inheritance,我有以下课程: public class A { public object Property1 { get; set; } public object Property2 { get; set; } public object Property3 { get; set; } //And for the sake of the example another 20 fields/properties public A() { } }
public class A
{
public object Property1 { get; set; }
public object Property2 { get; set; }
public object Property3 { get; set; }
//And for the sake of the example another 20 fields/properties
public A()
{
}
}
另一类:
public class B : A
{
//Bunch of other properties...
}
我有一个方法(来自不同的程序集,我无法更改),它返回一个类的新实例
有没有办法用类a的所有属性和字段(以及私有字段)强制转换/转换/初始化类B
我不能更改A类中的任何内容(它来自不同的程序集)
是否可以在不改变继承的情况下实现这一点 >考虑一个是继承而不是继承。< /P>
然后你可以很容易地创建一个B的实例并给它一个A的实例
你所要求的是可以做到的。当然,您可以轻松地复制所有属性的值,但对于字段,您必须使用反射来获取它们的值,因为如果A是以A类型创建的,您不能简单地将A转换为B
是否有方法强制转换/转换/初始化类B
您可以尝试显式类型转换,如下面的示例所示
struct Digit
{
byte value;
public Digit(byte value) //constructor
{
if (value > 9)
{
throw new System.ArgumentException();
}
this.value = value;
}
public static explicit operator Digit(byte b) // explicit byte to digit conversion operator
{
Digit d = new Digit(b); // explicit conversion
System.Console.WriteLine("Conversion occurred.");
return d;
}
}
class TestExplicitConversion
{
static void Main()
{
try
{
byte b = 3;
Digit d = (Digit)b; // explicit conversion
}
catch (System.Exception e)
{
System.Console.WriteLine("{0} Exception caught.", e);
}
}
}
从msdn中复制的代码=>为什么不让B包装A而不是从中继承?这可能是我的解决方案。但我想知道我所要求的是否可以实现。制作副本的一个可能技巧是序列化/反序列化。在您的例子中,
A
可以被序列化成某种东西,然后反序列化为B
。所有A
属性将被恢复,所有B
将具有默认值。问题是如何做到这一点,XmlSerializer
和BinarySerializer
将记住类型。欺骗他们是可能的,但也许有更好的无类型序列化程序(protobuf?)。重点是-序列化程序将为您完成所有的脏工作。显然,A
必须是可序列化的,否则您将无法获得完整副本。我认为这是不可能的。即使您设法通过反射来实现,也会违反OOP原则,并且您的一些代码很难维护。@Sinatr感谢它完成了这项工作。但是正如前面提到的,我最好包装一个,而不是使用继承。因此代码将更易于维护。这可能是我的解决方案。但我想知道我所要求的是否能实现。
struct Digit
{
byte value;
public Digit(byte value) //constructor
{
if (value > 9)
{
throw new System.ArgumentException();
}
this.value = value;
}
public static explicit operator Digit(byte b) // explicit byte to digit conversion operator
{
Digit d = new Digit(b); // explicit conversion
System.Console.WriteLine("Conversion occurred.");
return d;
}
}
class TestExplicitConversion
{
static void Main()
{
try
{
byte b = 3;
Digit d = (Digit)b; // explicit conversion
}
catch (System.Exception e)
{
System.Console.WriteLine("{0} Exception caught.", e);
}
}
}