C# 动态为对象属性指定值

C# 动态为对象属性指定值,c#,.net,C#,.net,我有一个属性为ct1-ct5的对象。该对象是自动生成的linq到sql对象。我想在c#中为这些属性赋值。有没有办法在for循环中实现这一点 e、 g.类似(对象名称:new_条件): for(inti=1;tag您可以使用反射来完成它。例如,假设您有一个类a,如下所示: class A { public int P1 { get; set; } public int P2 { get; set; } public int P3 { get; set; } } publi

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

e、 g.类似(对象名称:new_条件):


for(inti=1;tag您可以使用反射来完成它。例如,假设您有一个类
a
,如下所示:

class A
{
    public int P1 { get; set; }
    public int P2 { get; set; }
    public int P3 { get; set; }
}
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);
}
您可以在这个简单的控制台示例中这样做:

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

除了已经建议的反射之外,您还可以创建一个
字典
,为您完成作业。类似如下:

class A
{
    public int P1 { get; set; }
    public int P2 { get; set; }
    public int P3 { get; set; }
}
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);
}
公共静态int a0;
公共静态int a1;
公共静态int a2;
公共静态字典操作=新字典{
{“a0”,val=>a0=val},{“a1”,val=>a1=val},{“a2”,val=>a2=val};
静态void Main(字符串[]参数)
{
对于(int i=0;i<3;i++)
行动[“a”+i](i*2);
控制台写入线(a0);
控制台写入线(a1);
控制台写入线(a2);
}

仅通过反射,我很抱歉,谢谢您的回答。我想我将使用此解决方案。您是否可以详细说明为什么反射是唯一的解决方案。这仅仅是因为GetProperty()方法接受一个字符串参数,因此可以像这样动态使用,或者反射有什么东西适合这种特殊情况吗?反射不是唯一的选项,但在本例中它是更好的选项。好的,但为什么它是更好的选项?请参阅我对另一个选项的回答。它是更好的选项,因为虽然它是sl它比我的解决方案更简单。如果你能处理更复杂的问题,但能获得一点类型安全性和性能,请使用我的答案。你说的“类型安全”是什么意思?一般来说,反射的性能慢吗?