3

我有一个类似这样的类(这是代码的子集)

public struct overlay
{
    [FieldOffset(0)]
    public Byte[] b;
    [FieldOffset(0)]
    public Int32[] i;
}



 class MyClass
    {
    private overlay data;    \\Initialised using data.b=new Byte[4096]

    public Int32 site0 { set { data.i[0] = value; } get { return data.i[0]; } }
    public Int32 site1 { set { data.i[1] = value; } get { return data.i[1]; } }
    public String s
    {
        get { return System.Text.Encoding.ASCII.GetString(data.b, 8, 16).TrimEnd(' '); }
        set { System.Text.Encoding.ASCII.GetBytes(value.PadRight(16)).CopyTo(data.b, 8); }
    }
    public Int32 site2 { set { data.i[5] = value; } get { return data.i[5]; } }

    }

我目前访问这样的站点变量...

MyClass m=new MyClass();
m.site0=1;
m.site1=1;
m.site2=1;

我想像这样访问它们..

MyClass m=new MyClass();
for (Int32 i=0; i<m.sites.Count; ++i)
    m.sites[i]=1;

谁能建议我怎么做?

4

2 回答 2

3

您不能为班级中的字段创建索引器。您必须创建自己的类来存储数据,然后您可以创建其类型的字段。

class MyClass
{
    public MyIndexerClass Sites;
    public class MyIndexerClass
    {
        private byte[] data;

        public MyIndexerClass()
        {
            this.data = new byte[0];
        }
        public MyIndexerClass(byte[] Data)
        {
            this.data = Data;
        }

        public byte this[int index]
        {
            get
            {
                return data[index];
            }
            set
            {
                data[index] = value;
            }
        }
    }

    public MyClass()
    {
        this.Sites = new MyIndexerClass();
    }
    public MyClass(byte[] data)
    {
        this.Sites = new MyIndexerClass(data);
    }
}

如果你想使用Count属性和foreachon MyIndexerClass,你应该实现IEnumerable并创建你自己的Enumerator

于 2012-12-15T12:31:40.137 回答
0

C# 中的索引器语法允许这样做,它看起来像这样:

public byte this[int index] {
 get { return data[index]; }
 set { data[index] = value; }
}

这在类型上定义了一个索引器。用法就像

m[i] = 1;

但是,.NET 中的许多数组和列表结构已经具有索引器,因此您可以定义字段/属性sites,例如 Type List<byte>

于 2012-12-15T12:25:08.010 回答