繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM