3

オブジェクトの作成と値の設定/取得に問題があります。これの目的は、モデルからコントローラーにデータを返すことです。

免責事項: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";
4

8 に答える 8

5

C#でクラスをインスタンス化する必要があります。(JavaScriptのように)突然オブジェクトを作成することは、C#では不可能です。

たとえば、クラスは次のようになります。

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 から直接的または間接的に継承します。オブジェクト型の変数には、任意の型の値を割り当てることができます。」 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

を探している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

objectは、これらのプロパティまたはフィールドはありません。これらのフィールドにアクセスするには、変数を作成しますdynamic

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

ああ、ところでo["test"]は動作しません.. oJavaScriptまたはC#の辞書の連想配列ではありません..それは匿名オブジェクトです。

于 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"

このコードは、1 つのプロパティ ( ) と設定値をnew { test = "cat" };持つ新しい匿名型のインスタンスを作成します。testC# の匿名型は不変であるため、そのプロパティを作成すると、そのプロパティを他のものに設定することはできません。

適切にアクセスできない理由は、object. objectプロパティがないため、コンパイラは、オブジェクトがそのプロパティを持っているという知識を「失っています」。var変数が適切な型 (匿名型) であることを確認するために使用できます。これにより、適切な型を使用できるようになります。

var obj = new { test = "cat" };
string value = obj.test;
于 2013-01-24T16:22:26.973 に答える