1

我有一个Foo使用以下属性调用的目标类:

public string Bar1 { get; set; }
public string Bar2 { get; set; }
public string Bar3 { get; set; }
public string Bar4 { get; set; }
public string Bar5 { get; set; }
public string Bar6 { get; set; }

我正在读取一个文件,该文件可能包含任意数量的“条”,我将其读入名为fileBars. 我需要了解如何使用 Reflection 进行迭代fileBars并将第一个分配给Bar1,第二个分配给Bar2,等等。

我已经尝试了一些我在网上找到的东西,最近玩的是下面显示的东西,但我没有任何运气。熟悉反射的人可以指出我正确的方向吗?

var count = fileBars.Count();
var myType = Foo.GetType();
PropertyInfo[] barProperties = null;

for (var i = 0; i < count; i++)
{
    barProperties[i] = myType.GetProperty("Bar" + i + 1);
}
4

3 回答 3

2

您需要初始化barProperties

PropertyInfo[] barProperties = new PropertyInfo[count];

要为属性分配值,请使用SetValue

barProperties[i].SetValue(Foo, fileBars[i] );
于 2013-09-04T21:35:28.947 回答
2

我认为您不需要将PropertyInfo对象存储在数组中;您可以随时分配值:

var count = fileBars.Count();
var instance = new Foo();

for (var i = 1; i <= count; i++)
{
    var property = typeof(Foo).GetProperty("Bar" + i);
    if(property != null)
       property.SetValue(instance, fileBars[i - 1];
    else 
       // handle having too many bars to fit in Foo

}
于 2013-09-04T21:49:08.390 回答
2

除非您需要保留以后找到的所有属性,否则您不需要barProperties数组:

var myType = foo.GetType();
int barCount = 0;
foreach(string barValue in fileBars)
{
    barCount++;
    var barProperty = myType.GetProperty("Bar" + barCount);
    barProperty.SetValue(foo, barValue, null);
}
于 2013-09-04T21:49:41.377 回答