2013-01-24 2 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" }; 

업데이트 : .NET 3.5 있기 때문에 실제로이 같은 개체를 만들 수 있습니다 :

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

을하지만, 그들에게 당신을 만든 후 속성을 추가하거나 제거 할 수 없습니다.

+0

오 진짜?그건 미친 것입니다 – JREAM

+0

그는 (익명의 타입을 사용하여) 실제 객체를 만들고 있었고, 단지 객체로 저장하고 있었기 때문에 그것들과 함께 할 수 없었습니다. – Servy

+0

수정 사항이 잘못되었습니다. 그것은 익명의 타입이며, 동적 인 객체가 아닙니다. 사실 불변입니다. 'var'는 익명 타입과 마찬가지로 4.5가 아닌 .NET 3.5에서 소개되었습니다. * 실제 * 동적 인 객체는'ExpandoObject'이며 4.0에서 소개되었습니다. 그런 완전히 잘못된 대답이 동정심을 얻는 것은 수치 스럽습니다. – Servy

1

object에는 해당 속성이나 필드가 없습니다. 해당 필드에 액세스하려면 변수 dynamic을 작성하십시오.

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

오, BTW o["test"]은 작동하지 않을 것입니다 .. o 자바 스크립트 또는 C#의 사전에 ASSOC의 배열이 아닌 .. 그것은 익명의 개체입니다.

+0

예제를 제공해 줄 수 있습니까? – JREAM

+0

예제를 제공해야합니다 ... –

+1

여기에'var' 만 사용하면됩니다.이 때'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

@Kaf 동의. * 어깨를 으 *하면 – Daniel

1
new { test = "cat" }; 

당신은 익명을 만들려고 test 속성을 가진 개체로, 원하는대로 보이지 않습니다.초기화 할 경우 사용자 지정 속성은 당신이 원하는 경우

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

같은 사용자 정의 클래스를 정의해야

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

참고로 컴파일러에 의해 번역됩니다 다음 구문

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

를 사용 임의의 문자열을 값에 매핑하면 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에는 속성이 없으므로 컴파일러는 개체에 해당 속성이 있다는 지식을 "잃어 버리고"있습니다. C#을 객체의

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

JREAM, 당신의 기본 전제와 이해 아마됩니다 : 당신은 변수가 당신이 때에 프로퍼티를 사용 할 수 있습니다 (익명 타입 인)의 유형이 있는지 확인하기 위해 var을 사용할 수 있습니다 당신의 혼란을 일으키는 원인이되는 약간 결함이 있습니다.

"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'라는 새 클래스를 만듭니다. 우리는이 클래스 안에 하나의 속성을 가지고 있습니다. 그런 다음 클래스를 인스턴스화하고 그 내부의 속성에 액세스 할 수 있습니다. 인스턴스화 된 후에는 원하는만큼 속성에 액세스하고 새 값을 다시 할당 할 수 있습니다. 희망이 도움이됩니다.

+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");