我想访问带有Property的内部数组,但是控制对数组元素的访问。
我写了一个简单的例子,可以比我更好地解释我的问题。
在示例中,我提供了“Fail”类和“Controlled”类。第二个按照我的意愿运行,但方法有点不同,只有一个数组才有用。
我的问题是下一个: 如果我必须有两个不同的数组,因此有两个不同的属性呢。
怎么做?
感谢。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("The Fail Class:");
MyFailClass MyFailTestClass = new MyFailClass(5);
MyFailTestClass.MyList[2] = 11;
if (MyFailTestClass.Modified) {
Console.WriteLine("Right");
} else {
Console.WriteLine("Error");
}
Console.WriteLine("The Controlled Class:");
MyControlledClass MyControlledTestClass = new MyControlledClass(5);
MyControlledTestClass[2] = 11;
if (MyControlledTestClass.Modified) {
Console.WriteLine("Right");
} else {
Console.WriteLine("Error");
}
Console.ReadKey();
}
}
public class MyFailClass
{
// Property
public byte[] MyList
{
get
{
return myList;
}
set // <--------- Never enters here if I set a concrete array element
{
Modified = !myList.Equals(value);
myList = value;
}
}
public bool Modified { get; set; }
// Constructor
public MyFailClass(int elements)
{
myList = new byte[elements];
}
private byte[] myList;
}
public class MyControlledClass
{
// Property
public byte this[int index]
{
get
{
return myList[index];
}
set
{
Modified = !myList[index].Equals(value);
myList[index] = value;
}
}
public bool Modified { get; set; }
// Constructor
public MyControlledClass(int elements)
{
myList = new byte[elements];
}
private byte[] myList;
}
}
答案 0 :(得分:2)
您可以考虑用ObservableCollection<T>
替换您的数组属性。
您可能会将该属性公开为IList<T>
,因为它的可观察性是一个内部实现细节。
public class MyClass
{
public IList<byte> MyList
{
get { return _myList; }
}
private IList<byte> _myList = new ObservableCollection<byte>();
...
}
MyClass
的实施应处理_myList
的{{1}}和PropertyChanged
事件。
请注意,通常不需要setter用于集合属性 - 如果调用者想要替换他可以调用的列表:
CollectionChanged
然后添加新元素。
答案 1 :(得分:1)
如果你想要两个数组,那么你可能以后想要三个或四个(我不确定,但这看起来似乎就是这样)。
在这种情况下,我会考虑创建一个“MyControlledClass”聚合的类
public class IndexedClass
{
// Property
public byte this[int index]
{
get
{
return myList[index];
}
set
{
Modified = !myList[index].Equals(value);
myList[index] = value;
}
}
}
public class IndexedClassGroup
{
// Property
public IndexedClass this[int index]
{
get
{
return myList[index];
}
set
{
Modified = !myList[index].Equals(value);
myList[index] = value;
}
}
}
然后,你可以像二维数组那样访问这些东西。
就个人而言,理论上我对将数组暴露为可获取/可设置的概念有点怀疑,因此我不太了解这样做的细节。类是使用数组还是列表,或者看起来像私有实现细节而不是公共属性。如果您要暴露某些内容,请展示ICollection&lt;&gt;或IEnumerable&lt;&gt;并在内部将其解析为数组。无论如何,我的两分钱。