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);
        }
    }
}