2011-03-11 6 views
0

私のオブジェクトのプロパティに配列の値を割り当てたいと思います。vb.netのプロパティ値を変更するには

のような:

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

もっと見る必要がありますコード。 'Prop_i'のあなたの定義はどのように見えますか?あなたがしようとしていることを伝えるのは難しいですし、あなたがこれまでに持っていた2つの答えは全く違った方向に走っています。 3つ目の視点をミックスに追加する理由はありません。 :-) –

+0

私はその質問を理解していません。あなたは結果を望むものの例と、そこに到達するための最良の推測を提供できますか? – ja72

+0

すべてのプロパティは同じタイプですか?いくつの物件をここで話していますか?これは構造体またはクラス内にあり、プリミティブ型または参照型の型ですか? – ja72

答えて

4

VB.NETは動的言語ではありません。そのようなことはできません。

VB.NETは、C#のような「ダイナミック」のキーワードを持っていないので、あなたのオプションを反映している:

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

しかし、あなたはあなたの問題をより明示的にしている場合は、多分反射よりエレガントな解決策があります;)

+0

thnxは反射のために必要です。それは反射を通して働いた。誰かがそれが高価だと聞いたとして心配した – KoolKabin

+0

それはパフォーマンスの面でコストが、何がオプションですか?あなたはそのようなことが必要であり、それを行うための他のツールはありません:) –

0

あなたの財産はSetを定義する必要があります。これにより、プロパティを変更することができます。

0

C#でコードを書いてVB.NETで使用し、int、float、byteなどのプリミティブ型を格納する必要がある場合、すべてのプロパティは同じ型です。次に、フィールドをカバーする配列を持つ共用体構造を作成できます。

その後、あなたは、このようなコードを使用することができます:

[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]; 
       } 
      } 
     } 
    } 
} 

反射があなたのケースで動作するように注意してください(他の人のように答えている)のように宣言しますが、これは単に異なっている

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 

とき問題へのアプローチ(そして非常に速いアプローチ)。主な制限は、C#(sbyte、byte、short、ushort、int、uint、long、ulong、char、float、double、decimal、bool)でpointersにできるタイプです。

関連する問題