動的型付け - dynamicの利用 - C#

動的型付け機能(dynamic)を使って簡単なプログラムを作成してみます。

コード

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace DynamicSample
{

    public struct Position2D
    {
      public int X, Y;

      public override string ToString()
      {
        return string.Format("2D: ({0}, {1})", X, Y);
      }
    }

    public struct Position3D
    {
      public int X, Y, Z;

      public override string ToString()
      {
        return string.Format("3D: ({0}, {1}, {2})", X, Y, Z);
      }
    }

  public partial class Form1 : Form
  {

    public Form1()
    {
      InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
      Position2D p2d = new Position2D { X = 10, Y = 39 };
      Position3D p3d = new Position3D { X = 8, Y = 13, Z = 5 };
      
      dynamic px = new { X = 1, Y = 2 };
      /* または */
      //var px = new { X = 1, Y = 2 };
 
      int a = XYSum(p2d);
      int b = XYSum(p3d);
      int c = XYSum(px);

      textBox1.Text += Convert.ToString(a) + "\r\n";
      textBox1.Text += Convert.ToString(b) + "\r\n";
      textBox1.Text += Convert.ToString(c) + "\r\n";

    }
    
    static int XYSum(dynamic obj)
    {
      return (int)(obj.X + obj.Y);
    }

  }
}

解説

Position2D,Position3D,2つの構造体を定義しています。
Position2Dにはメンバ変数X,Yを、Position3Dにはメンバ変数X,Y,Zを定義します。

static int XYSum(dynamic obj)
{
  return (int)(obj.X + obj.Y);
}
にて、dynamic型のオブジェクトを受け取り、オブジェクトのメンバXとYを加算した値を返すメソッドを定義しています。引数をdynamic型にすることで定義された特定の型以外のオブジェクトを引数にとることができます。

int a = XYSum(p2d);
int b = XYSum(p3d);
int c = XYSum(px);
にて、XYSumメソッドを呼び出しています。1行名は引数にPosition2Dを与えています。2行目はPosition3Dを、3行目は暗黙の型(var)もしくは動的型付け変数(dynamic)の変数を与えています。
どの呼び出し方法でもメンバ変数XとYを加算した値を返し、テキストボックスに表示します。

実行例

プログラムを実行し、ボタンを押すと以下の結果を得られます。


著者
iPentecのメインプログラマー
C#, ASP.NET の開発がメイン、少し前まではDelphiを愛用
最終更新日: 2024-01-06
作成日: 2010-12-22
iPentec all rights reserverd.