2009-05-22 71 views
7

使用C#對象初始化語法我可以實例化一個匿名對象是這樣的:如果我有存儲在一個字符串,如初始化實例化使用C#對象初始化語法匿名對象存儲在字符串

object empData = new { name = "bob", age = 30, salary = 100000 }; 

但是什麼:

string init = "{ name = \"bob\", age = 30, salary = 100000 }"; 

什麼是將此字符串轉換爲對象實例的最佳方式?

回答

16

匿名類是C#syntactic sugar(請參見備註部分here)。 csc.exe創建一個具有私有字段和讀取/寫入屬性的類,其類型是從上下文推斷的。對象的所有用途都是再次推斷出來的。

這意味着你不能在運行時創建一個匿名類,因爲CLR認爲它們與其他類沒有區別(再次,因爲它是C#語法糖)。

所以不是:

  • 使用Dictionary<string,object>
  • 使用JSON.NET,XML或類似的東西具有用於解析字符串,得到一個對象有的已定義的方案。然而,這要求屬性必須明確。
  • 使用System.Reflection.Emit創建在運行時的類型,但我看不出有什麼實際的好處這在短短Dictionary<string,object>

我也有你在做什麼,因爲這是一個字符串很可能手段的擔憂對我來說,你正在接受某種用戶輸入。無論你做什麼,都要小心安全問題。

+0

啊......你是對的,我知道在編譯時生成的匿名類,但我的大腦並沒有建立連接(猜測長週末過期)。此外,您對安全和用戶輸入的擔憂絕對有效。無論如何,我這樣做的原因是因爲我調用的API使用了匿名對象。但事實證明,我也可以傳入Dictionary ,以便爲我解決問題。謝謝。 – DSO 2009-05-22 22:55:02

2

沒有直接簡單的方法來做到這一點。基本上,你有這些選項:

  1. 手動解析字符串。
  2. 使用C#編譯器將該對象編譯爲程序集的一部分,並使用反射來計算內容。
  3. (不確定是否可能,僅C#4.0):使用C#4.0託管編譯器類來解析表達式並推斷出這些內容。

在我看來,這些都不是理想的。我認爲QueryString就像對,XML或JSON或其他一些有解析器可用的格式,如果你有選擇,並考慮將數據存儲在字典實例中而不是爲每個表達式創建一個對象。

1

我不認爲這個問題的答案你本身,而是它會告訴你它爲什麼不能創建使用字符串的方式,對象的匿名情況下,如你的建議:

How do I create and access a new instance of an Anonymous Class passed as a parameter in C#?

匿名類型沒有任何公共字段,因此儘管您可以爲命名對象執行此操作,但對於匿名類型來說,這並不那麼簡單。也就是說,沒有任何東西可以阻止你(如BFree所建議的那樣)使用反射來爲匿名類型發出MSIL - 這不是非常簡單,但也不是不可能的。

3

最好的方法是使用序列化。但是,當然,這不使用您描述的相同的字符串格式。

您的對象初始值設定項不必包含常量值。

string myName="bob"; 
int myAge=30; 
double mySalary=100000; 

object empData = new { name = myName, age = myAge, salary = mySalary }; 

所以在你的情況下,你必須從你的字符串解析出的各個元素,並對其進行一些轉換強迫他們你想要的類型。

如果你不是這種特定字符串格式的結合體,你可以序列化和反序列化你的對象,並且使用XML更容易完成同樣的事情。

+0

+1問題範圍之外的思考......它一定是遲到了 – BenAlabaster 2009-05-22 21:12:32