0

我正在从某个地方获取 AAA 类的对象,我想在该对象中添加更多信息。所以,我正在创建一个从 AAA 派生的新类 BBB。BBB 类有额外的字段字典。我在派生类构造函数中填充该字典,该构造函数采用 AAA 类对象和我想用作字典键的项数组,而该字典的值是 AAA 类对象字段的元素。我尝试在示例代码中创建类似的场景:

void Main(){    
     A obj = new A () ;
     obj.prop1 =  new int [] {5 ,10, 15}   ;
     obj.prop2 =  "Hello" ;
     obj.prop3 = "World" ;
//   obj.Dump () ;
     B obj2 = new B (new int [] {1,2,3}, obj)  ;     
//   obj2.Dump () ;

}

// Define other methods and classes here
public class A {
    public int [] prop1 ;
    public string prop2 ;
    public string prop3 ;
}

public class B : A {
    public Dictionary <int, int> prop4 ;
    public B (int [] keys, A a) {
    prop4 = new Dictionary <int, int> () ;
        if (keys.Length == a.prop1.Length ) {
            for (int i = 0 ; i < keys.Length ; i++ ) {
                prop4.Add (keys[i], a.prop1[i]) ;
            }
            // is there a way to obsolete below lines of code???
            this.prop1 = a.prop1 ; 
            this.prop2 = a.prop2 ;
            this.prop3 = a.prop3 ;
        }
        else {
            throw new Exception ("something wrong") ;
        }           
    }
}

在派生类构造函数中,我手动填充属性,我不想这样做。有没有另一种方法来做到这一点。我的实际课程中有 20 多个属性。

4

5 回答 5

2

不能按您的要求做,但我建议为类创建一个复制构造函数A并将其与您的类B构造函数一起使用:

// Define other methods and classes here
public class A
{
    public int[] prop1;
    public string prop2;
    public string prop3;

    public A()
    {
    }

    public A(A orig)
    {
        prop1 = orig.prop1;
        prop2 = orig.prop2;
        prop3 = orig.prop3;
    }
}

public class B : A
{
    public Dictionary<int, int> prop4;

    public B(int[] keys, A a) : base( a )
    {
        prop4 = new Dictionary<int, int>();

        if (keys.Length == prop1.Length)
        {
            for (int i = 0; i < keys.Length; i++)
            {
                prop4.Add(keys[i], prop1[i]);
            }
        }
        else
        {
            throw new Exception("something wrong");
        }
    }
}
于 2013-10-22T15:05:30.380 回答
0

B(您正在构造的)的实例和(A您正在传递给构造函数的B)的实例不相关 - 它们保存不同的数据,它们位于不同的内存地址。B从传递的值更新实例的属性/字段的唯一方法A是复制。

于 2013-10-22T14:59:01.860 回答
0

嗯嗯......它有点不清楚和混淆你在做什么,但看看这个:

也许它与你需要的东西无关,但至少它可能会给你一个想法。

这就是您可以从一个类型的所有属性创建字典的方法。

public static Dictionary<string, object> DictionaryFromType(object atype)
{
    if (atype == null) return new Dictionary<string, object>();
    Type t = atype.GetType();
    PropertyInfo[] props = t.GetProperties();
    Dictionary<string, object> dict = new Dictionary<string, object>();
    foreach (PropertyInfo prp in props)
    {
        object value = prp.GetValue(atype, new object[]{});
        dict.Add(prp.Name, value);
    }
    return dict;
}

可能会帮到你。如果不让我知道删除这个问题。

于 2013-10-22T14:59:17.200 回答
0

您在此处实现的内容与copy constructor. 恐怕只能用手做!

我的建议是Properties在您的 A 类定义中使用并覆盖 B 类实现的属性:

// Define other methods and classes here
public class A
{
    public virtual int[] prop1 { get; set; }
    public virtual string prop2 { get; set; }
    public virtual string prop3 { get; set; }
}

public class B : A
{
    public Dictionary<int, int> prop4;

    public override int[] prop1
    {
        get
        {
            return m_WrappedAInstance.prop1;
        }
        set
        {
            m_WrappedAInstance.prop1 = value;
        }
    }

    public override string prop2
    {
        get
        {
            return m_WrappedAInstance.prop2;
        }
        set
        {
            m_WrappedAInstance.prop2 = value;
        }
    }

    public override string prop3
    {
        get
        {
            return m_WrappedAInstance.prop3;
        }
        set
        {
            m_WrappedAInstance.prop3 = value;
        }
    }

    A m_WrappedAInstance = null;
    public B(int[] keys, A a)
    {
        m_WrappedAInstance = a;
        prop4 = new Dictionary<int, int>();
        if (keys.Length == a.prop1.Length)
        {
            for (int i = 0; i < keys.Length; i++)
            {
                prop4.Add(keys[i], a.prop1[i]);
            }
        }
        else
        {
            throw new Exception("something wrong");
        }
    }
}

从功能上讲,这将起到类似的作用。唯一的缺点是您的包装类 A 实例不能再独立于您的 B 类实例进行更改。这是一个要求吗?

于 2013-10-22T15:04:56.623 回答
0

定义一个数组。然后将数组中的项目转换为单个属性

在 A 类

public object[] properties;

public int[] prop1 {
  get { return (int[]) properties[0]; }
  set { properties[0] = value; } }

public string prop2 {
  get { return (string)properties[1];  }
  set { properties[1] = value ; } }

B 的构造函数

public B (int[] keys, A obj)
    {
        properties = A.properties;
    }
于 2013-10-22T15:12:03.107 回答