2012-03-15 2 views
0

を知っているオブジェクトのプロパティには、私は次のように定義されているいくつかのパブリック変数があります。更新のみ、その名前

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]ここfield.Name == "ID"

  • fm.Titleが FMなる。[field.Name]ここfield.Name == "タイトル「

  • fm.Revは[field.Name]。 FMになり、どこfield.Name == "改訂"

は、このための解決策はありますか?ここで

私がこれまで持っているものの多くのコードです:

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; 
     } 
    } 
} 
+0

これは最終的にUIですか?あなたはWinFormsまたはWPFを使用していますか? – user7116

+2

あなたの質問の提示を心に留めてください。 –

答えて

2

これは、すべてのこれらの値が取得されているかに大きく依存しており、値が文字列である場合、あなたの限られた例から言うことは困難ですまたはオブジェクトとしてボックス化された正しい型。

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, ...); 
+0

あなたの例でTを指定する必要はありませんか? –

+0

@Baboon:彼が使用しているC#のバージョンによって異なります。 – user7116

+0

私はバージョン4.0を使用しています – Nick

4

私は私はあなたを正しく理解していないですが、ここで

を試している、次のように働くことができると言いました(しかし、ほとんどが効率的である)されていること

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"); 
+0

彼の' value'が適切な型であると仮定して、合意しました。 – user7116

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)); 
} 
関連する問題