2011-03-11 3 views
0

Я хотел бы присвоить свой массив vals свойствам моего объекта.Как изменить значение свойства в vb.net

нравится:

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

Нам нужно увидеть еще несколько код. Как выглядит ваше определение 'Prop_i'? Трудно сказать, что вы пытаетесь сделать, и два ответа, которые вы до сих пор ведете * в разных направлениях. Я не вижу причин добавлять третью перспективу в микс. :-) –

+0

Я не понимаю вопроса. Можете ли вы привести пример того, что вы хотите получить, и как вы можете догадаться, как туда добраться? – ja72

+0

Все ли свойства одного типа? Сколько свойств мы говорим здесь? Является ли это в структуре или классе и является ли тип примитивным или ссылочным типом? – ja72

ответ

4

VB.NET - это не динамический язык: вы не можете делать такие вещи.

Поскольку VB.NET не имеет «динамический» ключевое слово, как C#, ваш вариант отражения:

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

Но если вы более четко с вашей проблемой, может быть, есть более элегантное решение, чем отражение ;)

+0

thnx для asketion на отражение. Он работал через отражение. беспокоился, как слышал, что кто-то сказал это дорого. – KoolKabin

+0

Это стоит с точки зрения производительности, но какой вариант? Вам нужна такая вещь, и нет другого инструмента для этого: –

0

Ваше имущество необходимо определить Set. Это позволит вам изменить свойство.

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

Обратите внимание, что отражение должно работать в вашем случае (как и другие ответили), но это просто другой подход к проблеме (и очень быстрый). Основным ограничением является то, какие типы могут быть сделаны в pointers в C# (sbyte, byte, short, ushort, int, uint, long, ulong, char, float, double, decimal или bool)

Смежные вопросы