仅知道对象的名称,更新对象的属性

时间:2012-03-15 15:06:30

标签: c#

我有一些公共变量定义如下:

public class FieldsToMonitor
{
    public int Id { get; set; }
    public string Title { get; set; }
    public int Rev {get; set;}
}

我现在想用值填充这些变量,但fm.[varible name]需要与field.Name相同。如果我提前知道属性名称和属性名称的顺序,我将在这里填充循环:

// loop 1
fm.Id = revision.Fields[field.Name].Value;

// ... loop 2 ...
fm.Title = revision.Fields[field.Name].Value;

// ... loop 3 ...
fm.Rev = revision.Fields[field.Name].Value;

我希望在field.Name可以用属性名称替换的地方执行以下操作:

  • fm.ID成为 fm。[field.Name] where field.Name ==“ID”

  • fm.Title成为 fm。[field.Name] where field.Name ==“Title”

  • fm.Rev成为 fm。[field.Name]和field.Name ==“Rev”

有解决方法吗?

以下是我目前的更多代码:

public class FieldsToMonitor
{
    public int Id { get; set; }
    public string Title { get; set; }
    public int Rev {get; set;}
}

static BindingList<FieldsToMonitor> FieldsToMonitorList
     = new BindingList<FieldsToMonitor>();
// ...

// Loop through the work item revisions
foreach (Revision revision in wi.Revisions)
{
    fm = new FieldsToMonitor();
    // Get values for the work item fields for each revision
    var row = dataTable.NewRow();
    foreach (Field field in wi.Fields)
    {
        fieldNameType = field.Name;
        switch (fieldNameType)
        {
            case "ID":
            case "Title":
            case "Rev":
                // the following doesn't work
                fm + ".[field.Name]" = revision.Fields[field.Name].Value; 
                fm[field.Name] = revision.Fields[field.Name].Value;
                row[field.Name] = revision.Fields[field.Name].Value;
                break;
        }
    }
}

3 个答案:

答案 0 :(得分:5)

我不确定我是否理解正确,但这是一次尝试

public static class MyExtensions
{
    public static void SetProperty(this object obj, string propName, object value)
    {
        obj.GetType().GetProperty(propName).SetValue(obj, value, null);
    }
}

用法如

Form f = new Form();
f.SetProperty("Text", "Form222");

答案 1 :(得分:3)

这很大程度上取决于如何检索这些值,并且很难从有限的示例中判断出值是字符串还是只是作为对象加入的正确类型。

话虽如此,以下内容可行(但效率不高):

public static void SetValue<T>(T obj, string propertyName, object value)
{
    // these should be cached if possible
    Type type = typeof(T);
    PropertyInfo pi = type.GetProperty(propertyName);

    pi.SetValue(obj, Convert.ChangeType(value, pi.PropertyType), null);
}

用过:

SetValue(fm, field.Name, revision.Fields[field.Name].Value);
// or SetValue<FieldsToMonitor>(fm, ...);

答案 2 :(得分:0)

你将不得不使用反射来实现这一目标。这是一个简短的例子:

class Foo
{
    public int Num { get; set; }
}

static void Main(string[] args)
{
    Foo foo = new Foo() { Num = 7 };

    Console.WriteLine(typeof(Foo).GetProperty("Num").GetValue(foo, null));
}