[C#] dynamic타입의 동적 파라미터 - DynamicObject (WinForm에서 ASP.MVC의 ViewBag 오브젝트를 사용하는 방법)


Development note/C#  2019. 11. 25. 20:03

안녕하세요. 명월입니다.


이 글은 C#에서 dynamic타입의 동적 파라미터(WinForm에서 ASP.MVC의 ViewBag 오브젝트를 사용하는 방법)에 대한 글입니다.


ASP.MVC에서 Controller에서 View(*.cshtml)로 데이터를 넘길 때 ViewBag이라는 오브젝트를 사용하는데 이 ViewBag이라는 오브젝트가 참 편리합니다. 가독성이나 성능에는 약간 좋지 않지만 클래스를 일일히 생성해서 사용할 필요없이 그냥 동적인 프로퍼티를 생성하여 값을 넘기는 것에 대해 매우 편리합니다. 그것을 구현해 보겠습니다.

컨트럴에서 ViewBag 오브젝트에 임의의 프로퍼티에 값을 넣습니다.

View 파일에는 그냥 ViewBag의 임의의 프로퍼티의 값을 가져와 사용합니다.

참조 - [C# 강좌 - 67] MVC Framework 프로젝트 생성하기


ASP.NET이 아닌 콘솔 프로젝트에서 생성하여 만들겠습니다.

using System;
using System.Collections.Generic;
// dynamic 네임클래스가 필요한다.
using System.Dynamic;

namespace DynamicTest
{
  //DynamicObject를 상속받는다.
  public class DynamicDictionary : DynamicObject
  {
    // 외부에서는 동적 프로퍼티이지만 내무에서는 Dictionary로 구성된다.
    Dictionary<string, object> dictionary = new Dictionary<string, object>();
    
    // 동적 프로퍼티를 취득하는 메소드입니다. binder의 값은 동적 프로퍼티의 이름입니다.
    public override bool TryGetMember(GetMemberBinder binder, out object result)
    {
      string name = binder.Name.ToLower();
      return dictionary.TryGetValue(name, out result);
    }

    // 동적 프로퍼티를 작성하는 메소드입니다. binder의 값은 동적 프로퍼티의 이름입니다.
    public override bool TrySetMember(SetMemberBinder binder, object value)
    {
      dictionary[binder.Name.ToLower()] = value;
      return true;
    }
  }
  // ASP.NET처럼 추상 클래스를 만들어서 ViewBag 프로퍼티를 만들었습니다. ViewBag 프로퍼티에 동적으로 값을 작성할 수 있습니다.
  abstract class Controller
  {
    // 내부적으로는 DynamicDictionary를 만들어서 ViewBag의 이름으로 값을 사용할 수 있습니다.
    private DynamicDictionary dynamicDic = new DynamicDictionary();
    public dynamic ViewBag
    {
      get
      {
        return dynamicDic;
      }
    }
  }
  // Controller 클래스를 상속받습니다.
  class Program : Controller
  {
    public Program()
    {
      // ViewBag에 Test라는 프로퍼티에 Hello world를 넣습니다. 이전에 Test 프로퍼티라는 것은 선언하지 않았습니다.
      ViewBag.Test = "Hello world";
      Console.WriteLine(ViewBag.Test);
    }
    static void Main(string[] args)
    {
      new Program();
      Console.WriteLine("Press any key...");
      Console.ReadKey();
    }
  }
}

제가 C#에서 Window를 작성할 때, 값을 넘겨주기 위해 하나하나 클래스를 만들어서 넘겨 주다가 일회성 값들 때문에 클래스가 많아지는 것을 보고 가독성이 꽤 떨어진다고 판단되서 생각했습니다.

Window Form에서도 ASP.MVC의 ViewBag을 사용하면 얼마나 편할까 말입니다. 근데 찾아보니 있네요.

참조 - https://docs.microsoft.com/en-us/dotnet/api/system.dynamic.dynamicobject?view=netframework-4.8


진작에 알았으면 개발 속도를 좀 더 올릴 수 있지 않았을까 하는 아쉬움이 있네요.


여기까지 C#에서 dynamic타입의 동적 파라미터(WinForm에서 ASP.MVC의 ViewBag 오브젝트를 사용하는 방법)에 대한 설명이었습니다.


궁금한 점이나 잘못된 점이 있으면 댓글 부탁드립니다.