C#: extension method

DLLでエンティティを定義しておいて、
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace DotNetLib
{
    public class Person
    {
        public Person()
        {
            FirstName = "FirstName";
            LastName = "LastName";
        }
        public string FirstName { get; set; }   // auto (implemented) property in 3.0
        public string LastName { get; set; }
    }
}
UIは個別に実装。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApp35
{
    static class PersonExtension                // static method in 2.0
    {
        public static DotNetLib.Person Show(this DotNetLib.Person p, string message)
        {
            Console.WriteLine(message + " to " + p.FirstName + "  " + p.LastName);
            return p;
        }
    }
    class ExtensionMethod
    {
        public static void Run(string[] args)
        {
            DotNetLib.Person p = new DotNetLib.Person();
            p.Show("Hello");
        }
    }
}

image

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace CsWinApp
{
    static class PersonExtension                // static method in 2.0
    {
        public static DotNetLib.Person Show(this DotNetLib.Person p, string message)
        {
            System.Windows.Forms.MessageBox.Show(message + " to " + p.FirstName + "  " + p.LastName);
            return p;
        }
    }

    class ExtensionMethod
    {
        public static void Run(string[] args)
        {
            var p = new  DotNetLib.Person();
            p.Show("Good bye");   
        }
    }
}

image

こうなると使えるかも。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApp35
{
   static class PersonExtension                // static method in 2.0
    {
        public static DotNetLib.Person Show(this DotNetLib.Person p, string message)
        {
            Console.WriteLine(message + " to " + p.FirstName + "  " + p.LastName);
            return p;
        }
        public static IEnumerable<DotNetLib.Person> ShowAll(this IEnumerable<DotNetLib.Person> list)
        {
            foreach (DotNetLib.Person p in list)
            {
                p.Show("Hi");
            }
            return list;
        }
    }
  
    class ExtensionMethod
    {
        
        public static void Run(string[] args)
        {
            DotNetLib.Person p = new DotNetLib.Person();
            p.Show("Hello");

           
            DotNetLib.Person[] ps = new DotNetLib.Person[3]
            {new DotNetLib.Person(), new DotNetLib.Person(), new DotNetLib.Person() };

            ps.ShowAll();
           
        }
    }
}

image

IComparable<> を使う。

 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace DotNetLib
{
    public class Person : IComparable<Person>
    {
        public Person()
        {
            FirstName = "FirstName";
            LastName = "LastName";
            Age = (new Random(Guid.NewGuid().GetHashCode())).Next(100);
        }
        public string FirstName { get; set; }   // auto (implemented) property in 3.0
        public string LastName { get; set; }
        public int Age { get; set; }

        #region IComparable<Person>

        int IComparable<Person>.CompareTo(Person other)
        {
            return Age.CompareTo(other.Age);
        }

        #endregion
    }


}
大小比較とかソートとか。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApp35
{
    static class PersonExtension                // static method in 2.0
    {
        public static void Show(this DotNetLib.Person p, string message)
        {
            Console.WriteLine(message + " to " + p.FirstName + "  " + p.LastName + " " + p.Age + " Years");
        }
        public static void ShowAll(this IEnumerable<DotNetLib.Person> list)
        {
            foreach (DotNetLib.Person p in list)
            {
                p.Show("Hi");
            }
        }
    
        public static bool GreaterThan<T>(this T left, T right) where T : IComparable<T>
        {
            return left.CompareTo(right) > 0;
        }

        public static bool LessThan<T>(this T left, T right) where T : IComparable<T>
        {
            return left.CompareTo(right) < 0;
        }

        public static bool GreaterThanOrEqual<T>(this T left, T right) where T : IComparable<T>
        {
            return left.CompareTo(right) >= 0;
        }

        public static bool LessThanOrEqual<T>(this T left, T right) where T : IComparable<T>
        {
            return left.CompareTo(right) <= 0;
        }

        public static bool Equal<T>(this T left, T right) where T : IComparable<T>
        {
            return left.CompareTo(right) == 0;
        }
    }
  
    class ExtensionMethod
    {
        
        public static void Run(string[] args)
        {
            DotNetLib.Person p = new DotNetLib.Person();
            p.Show("Hello");

           
            DotNetLib.Person[] ps = new DotNetLib.Person[3]
            {new DotNetLib.Person(), new DotNetLib.Person(), new DotNetLib.Person() };

            ps.ShowAll();

            if (ps[0].GreaterThan(ps[1]))
                Console.WriteLine(" 0 is elter than 1 ");
            else if (ps[0].Equal(ps[1]))
                Console.WriteLine(" 0 is same age as 1 ");
            else
                Console.WriteLine(" 0 is youner than 1 ");

            List<DotNetLib.Person> psl = new List<DotNetLib.Person>(ps);
            psl.Sort();
            psl.ShowAll();
        }
    }
}
 
 

image

カテゴリー: 未分類 パーマリンク

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中