2013-07-03 96 views
1

我有一個從數據庫中檢索的對象XMLLog。表單允許用戶編輯對象中的字段,但由於錯綜複雜的原因,我無法返回修改的對象,我在Post中返回一個Keys列表。使用變量名訪問子對象

我想做到以下幾點:

//get XMLLog from the database 

foreach (var key in Request.Form.AllKeys) 
{ 
    XMLLog.key = Request.Form[key]; 
} 

//write XMLLog back to the Database 

有什麼辦法來完成,沒有一個巨大的case語句來測試每個可能的密鑰?

+0

我編輯了您的標題。請參閱:「[應該在其標題中包含」標籤「](http://meta.stackexchange.com/questions/19190/)」,其中的共識是「不,他們不應該」。 –

+0

重複[在C#中如何動態指定對象的成員,如obj \ [「abc」\]](http://stackoverflow.com/questions/5716766/in-c-sharp-how-to-dynamically -specify-a-object-like-objabc-in-p) –

回答

1

反思是你會怎麼做:

foreach (var key in Request.Form.AllKeys) 
{ 
    var prop = typeof(XMLLog).GetProperty(key); 
    prop.SetValue(myXmlLog, Request.Form[key], null); 
} 

這是假設所有的字符串結構非常簡單 - 你可能需要添加驗證,轉換等,根據不同的數據類型和複雜性的XMLLog班。

這也不是一個很好的解決方案。理想情況下,您可以讓框架將表單帖子映射到對象,就像使用MVC一樣。如果你多描述你的環境,也許我們可以得到更好的答案。

+0

我希望直接映射它,但不幸的是,XMLLog對象的源代碼以直接XML的形式上載到數據庫,最多五嵌套層和任何元素可能爲空的可能性。我們嘗試創建一個模型和編輯器模板,它坦率地說,比一個巨大的案例開關與一個形式的鍵後:)更混亂和容易出錯。 – ItinerantEngineer

3

您可以使用反射來做到這一點,但速度會很慢。以下是一個演示的主要的一個小程序(你可以編譯和運行它):

using System; 
using System.Collections.Generic; 
using System.Reflection; 

class Program 
{ 
    static void Main(string[] args) 
    { 
     var log = new XmlLog(); 
     var values = new Dictionary<string, string> { { "Hello", "1" }, { "World", "2" } }; 

     foreach (var methodInfo in typeof(XmlLog).GetProperties(BindingFlags.Instance | BindingFlags.Public)) 
     { 
      methodInfo.SetValue(log, values[methodInfo.Name]); 
     } 

     Console.WriteLine(log.Hello); 
     Console.WriteLine(log.World); 
    } 

    class XmlLog 
    { 
     public string Hello { get; set; } 
     public string World { get; set; } 
    } 
} 

這可以通過使用代碼生成速度更快。您有幾個選項,如:

  1. 對XmlLog類型使用反射並生成將與您的應用程序一起編譯的C#代碼。
  2. 使用Reflection來構建一個設置XmlLog屬性的表達式,然後在運行時將其編譯爲Func或Action。