我正在使用c#& .NET 3.5。供应商为我们提供了一个具有UserVarNbr1,UserVarData1,UserVarNbr2,UserVarData2,... UserVarNbrN,UserVarDataN属性的对象。不是我编写它的方式,但是,这是我们必须使用的。应用程序中的另一个对象返回用于表示这些UserVariables的项集合。
集合项具有此类属性
public string VariableName
{
get { return _VariableName; }
set { _VariableName = value; }
}
public string VariableData
{
get { return _VariableData; }
set { _VariableData = value; }
}
我需要遍历集合并创建供应商对象的实例并设置正确的属性。 UserVarNbrN,UserVarDataN需要放在正确的位置。请注意,该集合将VariableName作为字符串“03”返回,这需要驱动VendorObject属性UserVarNbr3,UserVarData3 **注意实际属性名称中没有“0”。如何引用正确的属性来获取/设置?
var o = new VendorObj();
到目前为止我有这样的事情。
foreach (var item in userVars)
{
const string propPrefix = "UserVar";
int varNum;
var isNum = int.TryParse(item.VariableName, out varNum);
if(isNum)
{
PropertyInfo pi;
//this is where I am stuck
// I need to set the corresponding properties on o
// example if varNum == 38, how do I reference
// o.(propPrefix+"Nbr"+varNum.ToString())
// and
// o.(propPrefix+"Data"+varNum.ToString())
// so I may set them?
}
}
感谢任何帮助。当它反思时,我是一个新手。
谢谢, 〜在圣地亚哥
答案 0 :(得分:2)
VendorObj vndr = new VendorObj();
Console.WriteLine("\nInitial value of instance property: {0}", vndr.InstanceProperty);
PropertyInfo piInstance = typeof(VendorObj).GetProperty("InstanceProperty");
Object obj = piInstance.GetValue(vndr, null);
piInstance.SetValue(vndr, 37, null);
Console.WriteLine("Final value of instance property: {0}", vndr.InstanceProperty);
答案 1 :(得分:1)
试试这个:
const string propPrefix = "UserVar";
VendorObj o = new VendorObj();
foreach (var item in userVars)
{
int varNum = 0;
if (Int32.TryParse(item.VariableName, out varNum))
{
string name = String.Format("{0}Nbr{1}", propPrefix, varNum);
o.GetType().GetProperty(name).SetValue(o, "some value", null);
}
}
答案 2 :(得分:0)
由于您将在一个对象上设置许多属性,因此最好获取PropertyDescriptorCollection
var o = new VendorObj();
PropertyDescriptorCollection properties = TypeDescriptor.GetProperties(o);
foreach (var item in userVars)
{
const string propPrefix = "userVar";
int varNum;
if (int.TryParse(item.VariableName, out varNum))
{
PropertyDescriptor property = properties.Find(propPrefix + "Nbr" + varNum, true);
property.SetValue(o, item.VariableData);
}
}