2013-01-02 40 views
1

默認初始過載,我決定添加自定義的獲取/的SetValue(與INotifyPropertyChanged的)輔助功能在我ViewModelBaseClass類似於安全的方法提到here類型。但我想添加可選的初始化器到具有理智默認值的Get幫助函數。不幸的是,default關鍵字將引用類型初始化爲null,可爲空的值類型爲null,並將值類型初始化爲默認值。如何允許吸氣幫手

我想製作一個通用函數,它將由Get helper調用,該函數返回類型的默認值,Numlable的BaseType的默認值(如果可能)以及具有默認構造函數的引用類型的默認構造函數。 對於不執行我想這可能返回null構造函數的引用類型。但搞清楚如何在一個叫新T()與默認(T),如果別人是很難的,編譯器說,它不具備正確的約束(因爲當然約束在運行時檢查)。

作爲替代,我想我可以使用的Get輔助方法,其中( 他說喬恩斯基特的http://msmvps.com/blogs/jon_skeet/archive/2010/11/02/evil-code-overload-resolution-workaround.aspx

這可能是我寫過的最可怕的代碼

拜託,請不要在現實生活中使用它,使用不同的方法名稱 或類似的東西。 不過,這是一個有趣的小拼圖,不是嗎?

)作爲一個好處,它可能會允許我強制引用類型沒有默認構造函數來指定一個非可選的init Func。

回答

1

你可以試試這個方法。我似乎無法找出一種更好的方式來返回可爲空類型的基礎類型的默認值。我會繼續搜索並更新我的帖子,如果我找到了一些東西。但是,如果沒有無參數構造函數,則不能傳遞引用類型。

static T GetDefault<T>() where T : new() 
{ 
    var type = typeof (T); 
    var underlying = Nullable.GetUnderlyingType(type); 
    if (underlying != null) 
     return (T) Activator.CreateInstance(underlying); 
    return new T(); 
} 

或者,你可以使用這個版本沒有new() contraint它使用反射在所有情況下,並且是出於這個原因,速度較慢。

static T GetDefault<T>() 
{ 
    var type = typeof (T); 
    var underlying = Nullable.GetUnderlyingType(type); 
    if (underlying != null) 
     return (T) Activator.CreateInstance(underlying); 
    var constructor = type.GetConstructor(Type.EmptyTypes); 
    return (T) (constructor == null ? default(T) : Activator.CreateInstance(type)); 
}