使用C#對象初始化語法我可以實例化一個匿名對象是這樣的:如果我有存儲在一個字符串,如初始化實例化使用C#對象初始化語法匿名對象存儲在字符串
object empData = new { name = "bob", age = 30, salary = 100000 };
但是什麼:
string init = "{ name = \"bob\", age = 30, salary = 100000 }";
什麼是將此字符串轉換爲對象實例的最佳方式?
使用C#對象初始化語法我可以實例化一個匿名對象是這樣的:如果我有存儲在一個字符串,如初始化實例化使用C#對象初始化語法匿名對象存儲在字符串
object empData = new { name = "bob", age = 30, salary = 100000 };
但是什麼:
string init = "{ name = \"bob\", age = 30, salary = 100000 }";
什麼是將此字符串轉換爲對象實例的最佳方式?
匿名類是C#syntactic sugar(請參見備註部分here)。 csc.exe創建一個具有私有字段和讀取/寫入屬性的類,其類型是從上下文推斷的。對象的所有用途都是再次推斷出來的。
這意味着你不能在運行時創建一個匿名類,因爲CLR認爲它們與其他類沒有區別(再次,因爲它是C#語法糖)。
所以不是:
Dictionary<string,object>
System.Reflection.Emit
創建在運行時的類型,但我看不出有什麼實際的好處這在短短Dictionary<string,object>
我也有你在做什麼,因爲這是一個字符串很可能手段的擔憂對我來說,你正在接受某種用戶輸入。無論你做什麼,都要小心安全問題。
沒有直接簡單的方法來做到這一點。基本上,你有這些選項:
在我看來,這些都不是理想的。我認爲QueryString就像對,XML或JSON或其他一些有解析器可用的格式,如果你有選擇,並考慮將數據存儲在字典實例中而不是爲每個表達式創建一個對象。
使用匿名類型是不可能的,但是您可以使用TypeBuilder類(具體爲TypeBuilder.Create(..))使用Reflection Emit來完成此操作。
http://msdn.microsoft.com/en-us/library/system.reflection.emit.typebuilder.createtype.aspx
我不認爲這個問題的答案你本身,而是它會告訴你它爲什麼不能創建使用字符串的方式,對象的匿名情況下,如你的建議:
How do I create and access a new instance of an Anonymous Class passed as a parameter in C#?
匿名類型沒有任何公共字段,因此儘管您可以爲命名對象執行此操作,但對於匿名類型來說,這並不那麼簡單。也就是說,沒有任何東西可以阻止你(如BFree所建議的那樣)使用反射來爲匿名類型發出MSIL - 這不是非常簡單,但也不是不可能的。
最好的方法是使用序列化。但是,當然,這不使用您描述的相同的字符串格式。
您的對象初始值設定項不必包含常量值。
string myName="bob";
int myAge=30;
double mySalary=100000;
object empData = new { name = myName, age = myAge, salary = mySalary };
所以在你的情況下,你必須從你的字符串解析出的各個元素,並對其進行一些轉換強迫他們你想要的類型。
如果你不是這種特定字符串格式的結合體,你可以序列化和反序列化你的對象,並且使用XML更容易完成同樣的事情。
+1問題範圍之外的思考......它一定是遲到了 – BenAlabaster 2009-05-22 21:12:32
啊......你是對的,我知道在編譯時生成的匿名類,但我的大腦並沒有建立連接(猜測長週末過期)。此外,您對安全和用戶輸入的擔憂絕對有效。無論如何,我這樣做的原因是因爲我調用的API使用了匿名對象。但事實證明,我也可以傳入Dictionary,以便爲我解決問題。謝謝。 –
DSO
2009-05-22 22:55:02