2014-09-21 111 views
2

我有一个属性为ct1-ct5的对象。该对象是一个自动生成的linq-to-sql对象。我想在c#中为这些属性赋值。有没有办法在for循环中做到这一点?动态地为对象属性赋值

例如像(对象名称:new_condition):

for (int i = 1; tag <= 5; i++) 
{ 
    new_condition.cti = values[i]; 
} 

其中CTI的i获取评估。

在此先感谢

+1

只能通过反射,恐怕 – lesscode 2014-09-21 02:56:40

回答

3

您可以使用反射。例如,supose你有一个类A这样的:

class A 
{ 
    public int P1 { get; set; } 
    public int P2 { get; set; } 
    public int P3 { get; set; } 
} 

你可以不喜欢这样简单的控制台样品中:

static void Main(string[] args) 
{ 
    var a = new A(); 
    foreach (var i in Enumerable.Range(1,3)) 
    { 
     a.GetType().GetProperty("P" + i).SetValue(a, i, null); 
    } 
    Console.WriteLine("P1 = {0}",a.P1); 
    Console.WriteLine("P2 = {0}",a.P2); 
    Console.WriteLine("P3 = {0}",a.P3); 
    Console.ReadLine(); 
} 

输出将是:

P1 = 1 
P2 = 2 
P3 = 3 
+0

嗨,谢谢你的回答。我想我会使用这个解决方案。你能否扩展为什么反射是唯一的解决方案。仅仅是因为GetProperty()方法需要一个字符串参数,因此可以像这样动态使用,或者是否有一些关于反射的东西适用于这种特殊情况? – bob 2014-09-21 04:25:19

+0

反射不是唯一的选择,但在这种情况下,它是更好的选择。 – brz 2014-09-21 04:33:54

+0

好吧,但为什么它是更好的选择? – bob 2014-09-21 05:34:52

1

旁边如已经建议的那样反射,您可以创建一个Dictionary<string,Action<T>>,为您完成分配任务。类似这样的:

public static int a0; 
public static int a1; 
public static int a2; 

public static Dictionary<string, Action<int>> actions = new Dictionary<string, Action<int>> { 
{"a0", val => a0 = val}, {"a1", val => a1 = val}, {"a2", val => a2 = val }}; 

static void Main(string[] args) 
{ 
    for (int i = 0; i < 3; i++) 
     actions["a" + i](i * 2); 

    Console.WriteLine(a0); 
    Console.WriteLine(a1); 
    Console.WriteLine(a2); 
}