当前位置:  开发笔记 > 编程语言 > 正文

在.NET中初始化基类

如何解决《在.NET中初始化基类》经验,为你挑选了3个好方法。

如果我需要用现有对象初始化对象的基础,我该怎么办?例如,在这种情况下:

public class A
{
    public string field1;
    public string field2;
}

public class B : A
{
    public string field3;
    public void Assign(A source)
    {
        this.base = source; // <-- will not work, what can I do here?
    }
}

Assign()方法显然可以逐字段地为基类赋值,但是没有更好的解决方案吗?由于B类继承自A,因此必须有一种方法可以将A分配给B.base

在C++中,这将是一件微不足道的事情,但我似乎无法掌握如何在.NET中执行此操作



1> Andrew Hare..:

不幸的base是只读.

[编辑]
好吧也许不那么不幸.基类和子类之间的关系IS-A不是HAS-A.通过允许子类更改基类的实例,您允许子类从IS-A基类开始更改自己的引用.如果您确实需要此功能,那么我建议您更改继承模型以反映您真正想要做的事情.

像这样的东西:

public class A
{
    public string field1;
    public string field2;
}

public class B
{
    public string field3;
    public A a;

    public void Assign(A source)
    {
        this.a = source;
    }
}

似乎更合适,具有更清晰的意义和功能.



2> BFree..:
        public Assign(A a)
        {
            foreach (var prop in typeof(A).GetProperties())
            {
                this.GetType().GetProperty(prop.Name).SetValue(this, prop.GetValue(a, null),null);
            }
        }

基本上,它使用反射来获取基础的所有属性并将其值分配给A中存在的所有值.

编辑:对于你们所有的反对者,我现在用一个有100个整数变量的基类来快速测试它.然后我在子类中使用了这个assign方法.运行需要46毫秒.我不了解你,但我对此完全没问题.


我恨人们说反思很慢.除非你正在处理性能关键代码,否则它实际上是一个非问题.我已经完成了反映许多类及其所有属性的反射(在整个DataContext类中有100个表)并且它花了很长时间.

3> Tamas Czineg..:

虽然这里有很多优秀的答案,但我认为正确的方法是链接构造函数:

public class A
{
    public string field1;
    public string field2;

    public A(string field1, string2 field2)
    {
         this.field1 = field1;
         this.field2 = field2;
    }
}

public class B : A
{
    public string field3;

    public B(string field1, string2 field2, string field3)
        : base(field1, field2)
    {
        this.field3 = field3;
    }
}

推荐阅读
Gbom2402851125
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有