2013-05-07 29 views
2

我想知道是否可以通過變量來引用類字段。像這樣:引用帶有變量的字段

int variable = 0; 
while (variable > 3) 
{ 
    class._fieldvariable = something; 
    i++ 
} 

如果我有字段:_field1,_field2,_field3我可以迭代他們所有。

主要理由這樣做,這是我有一個SQL查詢,將追加多條記錄,我寧願沒有多次做所有的參數,而是這樣的事情:

while (i < 4) 
} 
    command.Parameters.AddWithValue("@Alpha1", _alphai01.ToString()); 
    i++ 
} 

讓我用_alpha101設置參數3次,_alpha201和_alpha301用於三個不同的查詢。

謝謝!

+8

你想要的數組。 – SLaks 2013-05-07 14:19:18

+0

如果這是不可能的,你將不得不使用反射。 – 2013-05-07 14:19:42

+0

你有沒有控制類,而不是單個字段,你可以將它們全部包含在數組中(像SLaks建議的那樣)? – 2013-05-07 14:20:15

回答

0

您可以使用invokeMember調用屬性的一定二傳手:

Object obj; //your instance; 

obj.GetType().InvokeMember("Alpha1", 
BindingFlags.Instance | BindingFlags.Public | BindingFlags.SetProperty, 
Type.DefaultBinder, obj, "ValueForAlpha1"); 

這等於

obj.Alpha1 = "ValueForAlpha1"; 

http://msdn.microsoft.com/en-US/library/vstudio/66btctbe.aspx

1

關聯性的領域,所有的人都用GET /設置訪問權限。

如果我們真的在談論三個字段,或多或少乾淨的方式做到這一點是通過使用功能GetField(int index)這將返回相應的屬性。然後您的代碼可以是

class.GetField(i) = something; 

一種陣列是在更一般的情況更好(例如,如果字段的數量有望改變)。

我不希望將反射用於這樣一個簡單的目的。

+0

以及我的表是設置與15 varchar,10 int,10雙,10位,5日期。 我有一個3倍的字段數的對象,我想把它們分成不同的記錄。 alpha101去第一個記錄第一個varchar,alpha201第二個記錄,第一個varchar等... 我可以做一個case語句來抓取正確的參數通道塊,但如果我可以把它合併成一個塊我想至。 – Herrozerro 2013-05-07 15:26:39

+0

@Herrozerro你對我說的話聽起來像是讓事情比需要更復雜。 – 2013-05-07 15:47:20

0

你可以使用這樣的

反射,如果你有一個A級

public class A 
    { 
     int field1, field2, field3; 
    } 

,你可以將這些字段設置這樣

A obj = new A(); 
     for (int i = 1; i < 4; i++) 
     { 
      FieldInfo field = obj.GetType().GetField(String.Format("field{0}", i), BindingFlags.NonPublic | BindingFlags.Instance); 
      if (null != field) 
      { 
       field.SetValue(obj, i); 
      } 

     }