我想将我的数组值分配给我的对象的属性。
像:
For i = 1 To 32
myClass.Prop_i = val[i]
Next
答案 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)