2010年3月14日 星期日

C#自訂型態的強制轉換

我們常看到基本資料型態的強制轉換,如下:
int i = (int)123.456;


如果今天我們分別自訂了兩個無任何繼承關係的類別
要如何達成強制轉換呢?

ClassA x = new ClassA();
ClassB y = (ClassB)x;

在C#中可以使用implicit operator關鍵字來達成

這裡舉個簡單的例子,兩個類別的定義如下

class ClassA
{
 public int Amount = 0;
 public ClassA(int amount) { this.Amount = amount; }
}

class ClassB
{
 public string Content = string.Empty;
 public ClassB(string content) { this.Content = content;}
}

下面要示範的是,當ClassA強轉成ClassB時
ClassB.Content的字串,會是ClassA.Amount數個英文字母
假設ClassA.Amount等於10,則強轉後ClassB.Content會等於ABCDEFGHIJ

在ClassB中加入以下程式碼

public static implicit operator ClassB(ClassA obj)
{
 int amount = 0;
 if (obj.Amount > 26 || obj.Amount < 0)
  throw new Exception("out of range");
 else
  amount = obj.Amount;

 StringBuilder sb = new StringBuilder();
 for (int i = 0; i < amount; i++)
  sb.Append((char)(67 + i));
 ClassB result = new ClassB(sb.ToString());
 return result;
}

現在我們可以執行強轉了

static void Main(string[] args)
{
 ClassA a = Class(10);
 ClassB b = (ClassB)a;
 Console.WriteLine(b.Content);
 Console.Read();
}

沒有留言:

張貼留言