2013-01-24 48 views
3

我在創建對象和設置/獲取值時遇到了問題。這樣做的目的是將數據從模型返回到控制器。C#創建對象並更改值

免責聲明:進出口新的C#

誰能告訴我該做的正確方法是什麼?

我嘗試了這些方法,但我不斷收到錯誤:

object o = new { test = "cat" }; 
o.test = "dog"; 

Object o = new { test = "cat" }; 
o.test = "dog"; 

object o = new Object(); 
o.test = "dog"; 

// I also tried 
object o = new Object(); 
o["test"] = "dog"; 
+0

你究竟在做什麼? – Servy

+1

不是要表達自己的意思,而是真的? – Botonomous

+0

爲什麼不使用字典? – Kaf

回答

1

您需要實例在C#中的一類。在C#中不可能創建對象(如JavaScript)。

例如,類應該是這樣的:

public class MyClass { 
    public string test { get; set; } 
} 

MyClass o = new MyClass { test = "cat" }; 

更新:但是

var o = new { test = "cat" }; 
Console.WriteLine(o.test); 

,他們創造你後:由於.NET 3.5,你居然可以這樣創建對象無法添加或刪除屬性。

+0

哦真的嗎?這是瘋狂的 – JREAM

+0

他一直在創建真實的對象(使用匿名類型),他只是將它們存儲爲「對象」,因此不能對它們做任何事情。 – Servy

+0

你的編輯是錯誤的。這是一個匿名類型,它不是一個動態對象;實際上它是不可變的。在.NET 3.5中引入'var',而不是像匿名類型那樣引入4.5。一個* real *動態對象將是'ExpandoObject',並在4.0中引入。可惜的是,這樣一個完全錯誤的答案也是可憐的upvotes。 – Servy

1

object沒有這些屬性或字段。要訪問這些字段,請使用變量dynamic

dynamic o = new { test = "cat" }; 
Console.WriteLine(o.test); 

噢,順便說一句o["test"]不會工作.. o不是在JavaScript或C#的辭典中ASSOC陣列..它是一個匿名對象。

+0

你能否提供一個例子 – JREAM

+0

你應該提供一個例子...... –

+1

你只需要在這裏使用'var',不需要在這裏拋出'dynamic'。而且,即使使用'dynamic',最後一行也不行。 – Servy

1

通常,您將創建一個類並初始化此類的一個實例;但無論如何下面的作品。

請注意,即使test沒有聲明,它仍然會生成;但是在運行時你會有一個異常。

dynamic temp = ((dynamic)o).test; 
2

它看起來像你試圖創建的是一個anonymous type。匿名類型非常棒,因爲它們提供了一種快速便捷的方式來創建對象,而無需定義類型。

試試這個:

var o = new { test = "cat" }; 

在這一點上,你將能夠訪問像這樣的匿名類型的屬性:

o.test = "dog"; 
MessageBox.Show(o.test); //shows "dog" 
+0

我看不出有什麼問題。我認爲下來的選民應該解釋/評論爲什麼。 – Kaf

+0

@卡夫同意。 *聳肩* – Daniel

1
new { test = "cat" }; 

您正試圖創建一個匿名對象與test財產,這似乎並不是你想要的。如果要初始化自定義屬性使用下一個語法

var customer = new Customer {Name = "Ilya"}; 

這將通過編譯器翻譯成

var customer = new Customer(); 
customer.Name = "Ilya"; 

注意你應該這樣定義

public class Customer 
{ 
    public string Name { get; set; } 
} 
1

自定義類如果你想要一個任意映射一個字符串到一個值,那麼你應該使用Dictionary

Dictionary<string, string> lookup = new Dictionary<string, string>(); 
lookup.Add("test", "dog"); 
//add other pairs. 

string value = lookup["test"]; //value will be "dog" 

代碼new { test = "cat" };創建一個新的匿名類型與一個屬性(test)和一組值的一個實例。 C#中的匿名類型是不可變的,所以一旦創建它,​​您就無法將該屬性設置爲其他任何屬性。

您無法正確訪問它的原因是您將它存儲在object中。由於object沒有任何屬性,因此編譯器會「丟失」對象具有該屬性的知識。您可以使用var,以確保變量類型正確的(這是一個匿名類型),這將允許您使用屬性格式:

var obj = new { test = "cat" }; 
string value = obj.test; 
3

JREAM,您的基本前提和理解C#的對象可能是一個有點瑕疵,這是什麼造成你的困惑。 「在C#的統一類型系統中,所有類型,預定義和用戶定義的引用類型和值類型,都可以直接或間接從Object繼承,您可以將任何類型的值賦給對象類型的變量。 http://msdn.microsoft.com/en-us/library/9kkx3h3c%28v=vs.110%29.aspx

這就是說,最好是儘可能使用定義的類型而不是對象。在你的情況下,你的對象應該是類,然後依次使得你可以使用的引用類型。

public class O 
{ 
    public string test { get; set; } 
} 

var newO = new O() { test = "cat" }; 
newO = "dog"; 

在這裏,我們創建一個新類'O'。我們在這個類中有一個單獨的屬性。然後,我們可以實例化該類並訪問其中的屬性。一旦它被實例化,我們就可以像我們想要的那樣訪問屬性併爲其重新分配新的值。希望有所幫助。

+0

匿名類型在任何情況下都不會違反強類型。 – Servy

+1

同意,它根本沒有違反它。從可讀性的角度來看,我認爲它更傾向於定義更明確的強類型。我同意,它肯定不會違反它,我已經從我的答案中刪除了該行。 –

+0

您的代碼是靜態類型的或者不是。這並不是一個真正的東西。 – Servy

2

如果你正在尋找一個Key,Value pair你可以很容易地使用Dictionary;

using System.Collections.Generic; 

Dictionary<string, string> kv = new Dictionary<string, string>() { 
{"Key1","Value1"}, {"Key2","Value2"}, {"Key3","Value3"} 
}; 

並檢索爲;

string Val1 = kv["Key1"]; 

並添加鍵值,爲;

kv.Add("Key4","Value4");