C #에서 자체 동적 형식 또는 동적 개체를 만드는 방법은 무엇입니까?


130

예를 들어 클래스의 ViewBag 속성이 ControllerBase있으며 값을 동적으로 가져 오거나 설정할 수 있으며이 객체에 여러 추가 필드 또는 속성을 추가 할 수 있습니다 .MVC 응용 프로그램 및 Controller클래스 이외의 다른 것을 사용하고 싶습니다. 응용 프로그램의 유형. 동적 객체 를 생성 하고 아래와 같이 속성을 설정 하려고 할 때

1. dynamic MyDynamic = new { A="a" };
2. MyDynamic.A = "asd";
3. Console.WriteLine(MyDynamic.A);

내가있어 RuntimeBinderException메시지와 함께 건물 또는 인덱서 '<> f__AnonymousType0.A'에 할당 할 수 없습니다 - 그것은 읽기 전용입니다 또한 내가 그것은 내가 찾고-에 대한있어 매우 게 아니에요 제안 라인 2에. 어쩌면 다음과 같은 일을 할 수있는 수업이 있습니까?

??? MyDynamic = new ???();
MyDynamic.A = "A";
MyDynamic.B = "B";
MyDynamic.C = DateTime.Now;
MyDynamic.TheAnswerToLifeTheUniverseAndEverything = 42;

동적 추가 및 설정 속성.

답변:


279
dynamic MyDynamic = new System.Dynamic.ExpandoObject();
MyDynamic.A = "A";
MyDynamic.B = "B";
MyDynamic.C = "C";
MyDynamic.Number = 12;
MyDynamic.MyMethod = new Func<int>(() => 
{ 
    return 55; 
});
Console.WriteLine(MyDynamic.MyMethod());

ExpandoObject 클래스 및 추가 샘플 에 대해 자세히 알아보십시오 . 런타임시 멤버를 동적으로 추가 및 제거 할 수있는 오브젝트를 나타냅니다.


3
Visual Studio UserVoice 에서이 기능에 투표하십시오 .
orad

33

최근에 한 단계 더 나아가 야 할 필요가 있었는데, 이는 사용자 정의 항목을 기반으로 동적 객체에서 동적으로 속성을 추가하는 것이 었습니다. 여기 및 Microsoft의 ExpandoObject 문서 의 예제 는 속성 추가를 구체적으로 다루지는 않지만 속성을 열거하고 삭제하는 방법에서 추측 할 수 있습니다. 어쨌든, 나는 이것이 누군가에게 도움이 될 것이라고 생각했습니다. 다음은 키워드 및 기타 처리를 무시하고 ExpandoObject에 진정한 동적 속성을 추가하는 방법에 대한 매우 단순화 된 버전입니다.

        // my pretend dataset
        List<string> fields = new List<string>();
        // my 'columns'
        fields.Add("this_thing");
        fields.Add("that_thing");
        fields.Add("the_other");

        dynamic exo = new System.Dynamic.ExpandoObject();

        foreach (string field in fields)
        {
            ((IDictionary<String, Object>)exo).Add(field, field + "_data");
        }

        // output - from Json.Net NuGet package
        textBox1.Text = Newtonsoft.Json.JsonConvert.SerializeObject(exo);

32

ExpandoObject 당신이 찾고있는 것입니다.

dynamic MyDynamic = new ExpandoObject(); // note, the type MUST be dynamic to use dynamic invoking.
MyDynamic.A = "A";
MyDynamic.B = "B";
MyDynamic.C = "C";
MyDynamic.TheAnswerToLifeTheUniverseAndEverything = 42;

11

네임 스페이스에 ExpandoObject Class있는 것을 사용할 수 있습니다 System.Dynamic.

dynamic MyDynamic = new ExpandoObject();
MyDynamic.A = "A";
MyDynamic.B = "B";
MyDynamic.C = "C";
MyDynamic.SomeProperty = SomeValue
MyDynamic.number = 10;
MyDynamic.Increment = (Action)(() => { MyDynamic.number++; });

자세한 정보는 ExpandoObject MSDN 에서 찾을 수 있습니다.


9
dynamic myDynamic = new { PropertyOne = true, PropertyTwo = false};


7
 var data = new { studentId = 1, StudentName = "abc" };  

또는 가치가 존재한다

  var data = new { studentId, StudentName };
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.