2017年10月2日 星期一

C# : 泛型 Generic 類別內動態產生指定泛型物件

我們分別宣告簡單的類別與結構型別,接著,我們宣告了一個客製化的泛型類別 MyGenericClass<T>,這個泛型類別只有一個方法 GetInstance,他會根據我們建立這個泛型類別所傳送過去的型別,幫我們傳回這個型別的預設物件。

了解更多關於 [泛型的使用方式
了解更多關於 [C# 程式設計手冊 



我們要建立一個預設的物件,可以使用 System.Activator.CreateInstance 方法,不過,當泛型參數型別為字串 string 的時候,就會有問題了,因為,這個字串型別,他沒有無參數的預設建構函式,因此,我們需要呼叫其他的建構函式,這樣才能夠幫我們產生一個字串物件出來;因此,對於字串型別,我們使用了 Activator.CreateInstance(type, "".ToCharArray() 表示式來建立字串型別的物件。
由於呼叫System.Activator.CreateInstance所得到的物件,我們還需要將其轉型成為我們指定的泛型參數型別,在這裡,我們可以使用 (T) 就可輕鬆達到轉型的需求。
public class MyClass
{
    public int ID { get; set; }
    public string Name { get; set; }
}

public struct MyStruct
{
    public int ID { get; set; }
    public string Name { get; set; }
}


public class MyGenericClass<T> 
{
    public T MyObject { get; set; }
    public T GetInstance()
    {
        T myObject;
        var type = typeof(T);
        // 類別型別,使用 Activator.CreateInstance 動態來產生物件
        if(type.Name != "String")
        {
            myObject = (T)Activator.CreateInstance(type);
        }
        else
        {
            myObject = (T)Activator.CreateInstance(type, "".ToCharArray());
        }

        return myObject;
    }
}
測試用的程式碼
在這裡,我們使用泛型型別 MyGenericClass,請這個型別的 GetInstance 方法,幫助我們產生我們所指定的型別物件。
//var tmp = new string();
var tmp = new int();

MyGenericClass<int> myGenericObject1 = new MyGenericClass<int>();
MyGenericClass<MyClass> myGenericObject2 = new MyGenericClass<MyClass>();
MyGenericClass<MyStruct> myGenericObject3 = new MyGenericClass<MyStruct>();
MyGenericClass<string> myGenericObject4 = new MyGenericClass<string>();
Console.WriteLine($"MyGenericClass<int>() Object is : {myGenericObject1.GetInstance()}");
Console.WriteLine($"MyGenericClass<MyClass>() Object is : {myGenericObject2.GetInstance()}");
Console.WriteLine($"MyGenericClass<MyStruct>() Object is : {myGenericObject3.GetInstance()}");
Console.WriteLine($"MyGenericClass<string>() Object is : {myGenericObject4.GetInstance()}");

Console.WriteLine($"Press any key to Exist...{Environment.NewLine}");
Console.ReadKey();

執行結果
MyGenericClass<int>() Object is : 0
MyGenericClass<MyClass>() Object is : GenericDynObject.MyClass
MyGenericClass<MyStruct>() Object is : GenericDynObject.MyStruct
MyGenericClass<string>() Object is :
Press any key to Exist...



對於已經具備擁有 .NET / C# 開發技能的開發者,可以使用 Xamarin.Forms Toolkit 開發工具,便可以立即開發出可以在 Android / iOS 平台上執行的 App;對於要學習如何使用 Xamarin.Forms & XAML 技能,現在已經推出兩本電子書來幫助大家學這這個開發技術。
這兩本電子書內包含了豐富的逐步開發教學內容與相關觀念、各種練習範例,歡迎各位購買。
Xamarin.Forms 電子書
想要購買 Xamarin.Forms 快速上手 電子書,請點選 這裡

想要購買 XAML in Xamarin.Forms 基礎篇 電子書,請點選 這裡




沒有留言:

張貼留言