3

I am having a problem creating an object and setting/getting the values. The purpose of this is to return data from a Model to a Controller.

Disclaimer: Im new to C#

Can anyone show me the right way to do it?

I have tried these ways but I keep getting the error:

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";
4

8 回答 8

5

您需要在 C# 中实例化一个类。在 C# 中不可能突然创建对象(如在 JavaScript 中)。

例如,该类将如下所示:

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

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

更新:从 .NET 3.5 开始,您实际上可以创建如下对象:

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

但是,创建它们后,您将无法添加或删除属性。

于 2013-01-24T16:16:44.113 回答
5

JREAM,您对 C# 对象的基本前提和理解可能有点缺陷,这就是造成您困惑的原因。

“在 C# 的统一类型系统中,所有类型,预定义的和用户定义的,引用类型和值类型,都直接或间接地继承自 Object。您可以将任何类型的值赋给 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”。我们在这个类中有一个属性。然后我们可以实例化该类并访问其中的属性。一旦它被实例化,我们就可以尽可能多地访问该属性并为其重新分配新值。希望有帮助。

于 2013-01-24T16:24:04.013 回答
3

如果您正在寻找 a 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");
于 2013-01-24T16:33:08.793 回答
2

Anobject没有这些属性或字段。要访问这些字段,请创建变量dynamic.

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

哦,顺便说一句o["test"],这行不通。o它不是 JavaScript 或 C# 字典中的 assoc 数组。它是一个匿名对象。

于 2013-01-24T16:17:04.103 回答
2

看起来您要创建的是匿名类型。匿名类型很棒,因为它们提供了一种快速便捷的方式来创建对象,而无需定义类型。

尝试这个:

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

此时,您将能够访问匿名类型的属性,如下所示:

o.test = "dog";
MessageBox.Show(o.test);  //shows "dog"
于 2013-01-24T16:21:20.873 回答
1

通常,您创建一个类并初始化该类的一个实例;但无论如何以下工作。

请注意,即使test没有声明,它仍然会构建;但是您在运行时会遇到异常。

dynamic temp = ((dynamic)o).test;
于 2013-01-24T16:20:03.760 回答
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; }
}
于 2013-01-24T16:22:25.803 回答
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;
于 2013-01-24T16:22:26.973 回答