动态地为对象属性分配值

3
我有一个拥有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
2个回答

6
您可以使用反射来实现。例如,假设您有一个类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

谢谢您的答复。我想我会使用这个解决方案。您能否详细解释一下为什么反射是唯一的解决方案呢?它仅仅因为 GetProperty() 方法接受一个字符串参数,所以可以像这样动态地使用,还是反射本身有助于处理这种特定情况? - bob
反思并不是唯一的选择,但在这种情况下它是更好的选择。 - brz
好的,但为什么它是更好的选择? - bob
看看我的另一个选项。它是更好的选择,因为虽然它比我的解决方案慢且不类型安全,但比我的解决方案更简单。如果你可以处理一些更复杂的内容,但获得一些类型安全和性能,请使用我的答案。 - brz
“Type safe” 是什么意思?反射在一般情况下性能较慢吗? - bob
反射有点慢,但我认为在这种情况下不是一个大问题(许多流行的库使用反射进行许多操作)。另一方面,brz的解决方案是一个可能的选择,唯一的坏处是你需要使用字典映射每个属性,我认为这更加复杂,也不太安全:如果字典索引未找到,则会抛出异常...但正如我已经说过的,这是一个可行的解决方案。 - Raúl Otaño

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接