Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将属性从父类提取到其子类_C#_Oop - Fatal编程技术网

C# 将属性从父类提取到其子类

C# 将属性从父类提取到其子类,c#,oop,C#,Oop,我有以下课程: public class ParentClass { public string Name {get;set;} public int Age {get;set;} } public class SubClass : ParentClass { public int Id {get;set;} } 我有以下方法: public void InsertSubClass(Pa

我有以下课程:

    public class ParentClass
    {
        public string Name {get;set;}
        public int Age {get;set;}
    }

    public class SubClass : ParentClass
    {
        public int Id {get;set;}

    }
我有以下方法:

    public void InsertSubClass(ParentClass parentClass)
    {
        SubClass subClass = new SubClass();
        subClass.Id = 1;
        subClass.Age = parentClass.Age;
        subClass.Name= parentClass.Name;


    }
我如何重构这个方法,使我不需要将参数ParentClass的属性逐个分配到子类的属性中? 有没有更有效的替代方案?或者这真的是怎么做到的?我只是在想,如果房产很多,这可能会很乏味


提前感谢。:)

不能像这样将父类分配给子对象的基对象
child.base=parent
。此外,您不能将paret类强制转换为child-like
varo=(child)parent;o、 id=1您所能做的就是将构造函数添加到接收父类的子类,并在该构造函数中工作。

您不能像这样将父类分配给子类的基对象
child.base=parent
。此外,您不能将paret类强制转换为child-like
varo=(child)parent;o、 id=1您所能做的就是将构造函数添加到接收父类的子类中,并在该构造函数中工作。

您可以通过创建复制构造函数来实现这一点。无论如何,您必须在某个地方指定父类属性,因为在这种情况下强制转换不起作用

public class ParentClass
{
    public string Name { get; set; }
    public int Age { get; set; }

    public ParentClass()
    {

    }

    //Copy constructor
    public ParentClass(ParentClass parentClass)
    {
        this.Name = parentClass.Name;
        this.Age = parentClass.Age;
    }
}

public class SubClass : ParentClass
{
    public int Id { get; set; }

    public SubClass(ParentClass parentClass, int id) : base(parentClass)
    {
        this.Id = id;
    }
}
下面是在父构造函数中分配父属性的复制构造函数方式

public class ParentClass
{
    public string Name { get; set; }
    public int Age { get; set; }

    public ParentClass()
    {

    }

    //Copy constructor
    public ParentClass(ParentClass parentClass)
    {
        this.Name = parentClass.Name;
        this.Age = parentClass.Age;
    }
}

public class SubClass : ParentClass
{
    public int Id { get; set; }

    public SubClass(ParentClass parentClass, int id) : base(parentClass)
    {
        this.Id = id;
    }
}
现在这个方法看起来是这样的

public static void InsertSubClass(ParentClass parentClass)
{
    SubClass subClass = new SubClass(parentClass, 1);
}
更新

如果您不能对父类和子类进行更改,那么如何在静态类中为父类创建一个扩展方法,如下所示

public static void ShallowConvert<T, U>(this T parent, U child)
{
    foreach (PropertyInfo property in parent.GetType().GetProperties())
    {
        if (property.CanWrite)
        {
            property.SetValue(child, property.GetValue(parent, null), null);
        }
    }
}
public static void shallwconvert(此T父级,U子级)
{
foreach(parent.GetType().GetProperties()中的PropertyInfo属性)
{
if(property.CanWrite)
{
SetValue(子,property.GetValue(父,null),null);
}
}
}

注意:这可能不适用于私有属性和字段。

您可以通过创建复制构造函数来实现这一点。无论如何,您必须在某个地方指定父类属性,因为在这种情况下强制转换不起作用

下面是在父构造函数中分配父属性的复制构造函数方式

public class ParentClass
{
    public string Name { get; set; }
    public int Age { get; set; }

    public ParentClass()
    {

    }

    //Copy constructor
    public ParentClass(ParentClass parentClass)
    {
        this.Name = parentClass.Name;
        this.Age = parentClass.Age;
    }
}

public class SubClass : ParentClass
{
    public int Id { get; set; }

    public SubClass(ParentClass parentClass, int id) : base(parentClass)
    {
        this.Id = id;
    }
}
现在这个方法看起来是这样的

public static void InsertSubClass(ParentClass parentClass)
{
    SubClass subClass = new SubClass(parentClass, 1);
}
更新

如果您不能对父类和子类进行更改,那么如何在静态类中为父类创建一个扩展方法,如下所示

public static void ShallowConvert<T, U>(this T parent, U child)
{
    foreach (PropertyInfo property in parent.GetType().GetProperties())
    {
        if (property.CanWrite)
        {
            property.SetValue(child, property.GetValue(parent, null), null);
        }
    }
}
public static void shallwconvert(此T父级,U子级)
{
foreach(parent.GetType().GetProperties()中的PropertyInfo属性)
{
if(property.CanWrite)
{
SetValue(子,property.GetValue(父,null),null);
}
}
}

注意:这可能不适用于私有属性和字段。

从发布的代码中可以看出,您正在创建两个不同的实例。
InsertSubClass
方法看起来更像是在两个类之间转换值的方法。为了给出更好的答案,您可以在
ParentClass
使用构造函数重载中发布如何将值分配给属性。如果属性很多,那么检查哪些属性是可以运行类的最小属性。如果属性在增加,则使用抽象。如果你不需要为base赋值意味着什么?在这些情况下提供默认值。根据发布的代码,看起来您正在创建两个不同的实例。
InsertSubClass
方法看起来更像是在两个类之间转换值的方法。为了给出更好的答案,您可以在
ParentClass
使用构造函数重载中发布如何将值分配给属性。如果属性很多,那么检查哪些属性是可以运行类的最小属性。如果属性在增加,则使用抽象。如果你不需要为base赋值意味着什么?在这些情况下提供默认值。谢谢Jenish,是的,这将起作用,但问题是不应修改类ParentClass。@wuU如果不想更改基类,则重载强制转换也将不起作用。在这种情况下,您必须逐个分配属性。谢谢Jenish,是的,这会起作用,但是问题是不应该修改类ParentClass。@wuU如果您不想更改基类,则重载Cast也不会起作用。在这种情况下,您必须逐个指定属性。