我可以使用反射和字符串来获取/设置对象的正确属性吗?

时间:2009-12-30 00:44:58

标签: c# reflection oop properties

我正在使用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? 
            }
        }

感谢任何帮助。当它反思时,我是一个新手。

谢谢, 〜在圣地亚哥

3 个答案:

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