扩展类的初始化
本文关键字:初始化 扩展 | 更新日期: 2023-09-27 18:36:34
我正在从某个地方获取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 多个属性。
无法按照您的要求进行操作,但我建议为类 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");
}
}
}
您在这里实现的内容与copy constructor
非常相似。恐怕只有用手做
我的建议是在 A 类定义中使用 Properties
并覆盖 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 类实例进行更改。这是要求吗?
B
的实例(您正在构造)和A
的实例(您正在传递给 B
的构造函数)是不相关的 - 它们保存不同的数据,它们位于不同的内存地址上。从传递A
的值更新实例的属性/字段B
的唯一方法是复制。
嗯嗯...它有点不清楚和困惑你在做什么,但看看这个:
也许它与你需要什么无关,但至少它可能会给你一个想法。
这就是从类型的所有属性创建字典的方法。
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;
}
可能会帮助你。如果没有,请告诉我删除此问题。
定义一个数组。 然后将数组中的项强制转换为各个属性
在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;
}