确定正在使用c#设置数组属性的哪个索引
本文关键字:属性 数组 索引 设置 | 更新日期: 2023-09-27 18:19:22
我正在创建一个OPC客户端,可以读取电子设备的标签。这是通过在OPC组中设置项来完成的。我想要一个属性,它是一个bool[]数组,用于将项目设置为活动或不活动。我需要知道这个属性bool[]的哪个索引被用来设置属性,这样我就可以使用它来激活项目。我可以只用方法,但更喜欢用属性。_theGroup是保存条目的OPC组。
private bool[] _ItemActive;
public bool[] itemActive {
get { return _ItemActive; }
set {
if (_theGroup != null) {
int itemIndex = ?? // I don't know how to find property index access by user
int itemHandle = itemHandles[itemIndex]; //uses index to discover handle
_theGroup.SetActiveState(itemHandle, value, out err); // use handle to set item active
}
_ItemActive = value;
}
}
用户会做这样的事情。
opcClient.itemActive[3] = false;
我需要能够发现3并将其插入itemIndex中,如上所示,在我的bool[]数组的setter中
您可以使用重写索引操作符创建自定义集合,在其中执行自定义逻辑。但是创建setter方法SetItemActivation(int,bool)
似乎是一个更简洁的解决方案。
我找到了一个解决方案:创建一个新的类,其实例跟踪其条目的变化;每当索引值被更改时,就会触发一个事件,告知更改了哪个条目以及更改到什么值。下面就是这样一个类(当然,下面的代码可以使用泛型来代替bool,以便更通用):
// This class tracks changes to its entries
public class BoolArray_Tracked{
// Set up the data for which changes at specific indices must be tracked
private bool[] _trackedBools;
public bool this[int itemIndex]{
get { return _trackedBools[itemIndex]; }
set {
// check if something really changed
// not sure if you want this
if(_trackedBools[itemIndex] != value){
_trackedBools[itemIndex] = value;
OnIndexChanged(itemIndex, value);// Raise an event for changing the data
}
}
}
// Constructor
public BoolArray_Tracked(bool[] _trackedBools){
this._trackedBools = _trackedBools;
}
// Set up the event raiser
public delegate void IndexEventHandler(object sender, IndexEventArgs a);
public event IndexEventHandler RaiseIndexEvent;
// Raise an event for changing the data
private void OnIndexChanged(int indexNumber, bool boolValue){
if (RaiseIndexEvent != null)
RaiseIndexEvent(this, new IndexEventArgs(indexNumber, boolValue));
}
}
// This is class enables events with integer and boolean fields
public class IndexEventArgs : EventArgs{
public int Index{get; private set;}
public bool Value{get; private set;}
public IndexEventArgs(int _index, bool _value){
Index = _index;
Value = _value;
}
}
下一步实现OPC类:
class OPC_client{
// Tracked bool array
public BoolArray_Tracked ItemActive{get; set;}
// Constructor
public OPC_client(bool[] boolItemActive){
ItemActive = new BoolArray_Tracked(boolItemActive);
ItemActive.RaiseIndexEvent += Handle_ItemActive_IndexChange;
}
// State what should happen when an item changes
private void Handle_ItemActive_IndexChange(object sender, IndexEventArgs e){
//if (_theGroup != null) {//Your code in the question
int itemIndex = e.Index;
//int itemHandle = itemHandles[itemIndex]; //Your code
//_theGroup.SetActiveState(itemHandle, value, out err); // Yours
//} //Your code
Console.WriteLine("The array `ItemActive' was changed"
+ " at entry " + itemIndex.ToString()
+ " to value " + e.Value.ToString());
}
}
最后实现一个简单的程序来测试这个
static void Main(string[] args){
OPC_client opcTest = new OPC_client(new bool[]{true, false});
Console.WriteLine("Testing if message appears if value stays the same");
opcTest.ItemActive[0] = true;
Console.WriteLine();
Console.WriteLine("Testing if message appears if value changes");
opcTest.ItemActive[0] = false;
Console.ReadLine();
}