我如何更改vb.net中的属性值

时间:2011-03-11 08:51:59

标签: vb.net class properties

我想将我的数组值分配给我的对象的属性。

像:

    For i = 1 To 32
        myClass.Prop_i = val[i]
    Next

3 个答案:

答案 0 :(得分:4)

VB.NET不是一种动态语言:你不能做这些事情。

由于VB.NET没有像C#这样的“动态”关键字,你的选择就是反思:

myClass.GetType().GetProperty("Prop_" + i.ToString()).SetValue(myClass, val[i], null);

但是如果你对你的问题更明确,也许有一个比反思更优雅的解决方案;)

答案 1 :(得分:0)

您的财产需要定义Set。这将允许您修改属性。

答案 2 :(得分:0)

如果您愿意在C#中编写一些代码并在VB.NET中使用它,并且需要存储基本类型,如int,float或byte,并且所有属性都属于同一类型。然后,您可以创建一个包含字段的数组的联合结构。

然后你可以使用这样的代码:

Sub Main()  ' vb.net

    Dim bag As New PropertyBag()
    bag.AllProperties = New Single() {1, 2, 3, 4, 5, 6, 7, 8}
    Dim three As Single = bag.Prop_3    'returns 3
    Dim five As Single = bag(4)         'returns 5 (0-based index)

End Sub

声明为

[StructLayout(LayoutKind.Explicit, Size=Size)]
public unsafe struct PropertyBag
{
    const int Count = 8;    //8 fields
    const int Size = 8 * 4; //4 bytes per field

    [FieldOffset(0)]
    fixed float list[Count];

    [FieldOffset(0)]        float x1;
    [FieldOffset(4)]        float x2;
    [FieldOffset(8)]        float x3;
    [FieldOffset(12)]        float x4;
    [FieldOffset(16)]        float x5;
    [FieldOffset(20)]        float x6;
    [FieldOffset(24)]        float x7;
    [FieldOffset(28)]        float x8;        

    public float Prop_1 { get { return x1; } set { x1 = value; } }
    public float Prop_2 { get { return x2; } set { x2 = value; } }
    public float Prop_3 { get { return x3; } set { x3 = value; } }
    public float Prop_4 { get { return x4; } set { x4 = value; } }
    public float Prop_5 { get { return x5; } set { x5 = value; } }
    public float Prop_6 { get { return x6; } set { x6 = value; } }
    public float Prop_7 { get { return x7; } set { x7 = value; } }
    public float Prop_8 { get { return x8; } set { x8 = value; } }

    public float this[int index]
    {
        get
        {
            fixed (float* ptr = list)
            {
                return ptr[index];
            }
        }
        set
        {
            fixed (float* ptr = list)
            {
                ptr[index] = value;
            }
        }
    }

    public float[] AllProperties
    {
        get
        {
            float[] res = new float[Count];
            fixed (float* ptr = list)
            {
                for (int i = 0; i < Count; i++)
                {
                    res[i] = ptr[i];
                }
            }
            return res;
        }
        set
        {
            fixed (float* ptr = list)
            {
                for (int i = 0; i < Count; i++)
                {
                    ptr[i] = value[i];
                }
            }
        }
    }
}

请注意,反射应该适用于您的情况(就像其他人已经回答的那样),但这只是解决问题的一种不同方法(也是一种非常快速的方法)。主要限制是在C#中可以将哪些类型转换为pointers(sbyte,byte,short,ushort,int,uint,long,ulong,char,float,double,decimal或bool)