[英]Can I use reflection and a string to get/set the correct property of an object?
我正在使用C#和.NET 3.5。 供应商给我们提供了一个对象,该对象的属性为UserVarNbr1,UserVarData1,UserVarNbr2,UserVarData2,... UserVarNbrN,UserVarDataN。 不是我编写代码的方式,但是,这是我们必须使用的方式。 应用程序中的另一个对象返回用于表示这些UserVariable的项目的集合。
收集项目具有这样的属性
public string VariableName
{
get { return _VariableName; }
set { _VariableName = value; }
}
public string VariableData
{
get { return _VariableData; }
set { _VariableData = value; }
}
我需要遍历集合,并创建供应商对象的实例并设置正确的属性。 UserVarNbrN,UserVarDataN需要放置在正确的位置。 请注意,集合以字符串“ 03”的形式返回VariableName,这需要驱动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?
}
}
任何帮助表示赞赏。 当我反思时,我是一个菜鸟。
谢谢,〜ck在圣地亚哥
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);
尝试这个:
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);
}
}
由于将在一个对象上设置许多属性,因此最好获取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);
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.