我决定在ViewModelBaseClass中添加自定义Get/SetValue(带有INotifyPropertyChanged(辅助函数,类似于这里提到的类型安全方法。但我想为Get-helper函数添加可选的初始值设定项,该函数具有正常的默认值。遗憾的是,default关键字将引用类型初始化为null,将可为null的值类型初始化为null,并将值类型初始化成默认值。
我想制作一个由Get助手调用的泛型函数,该函数返回类型的默认值、Nullable的BaseType的默认值(如果可能的话(以及具有默认构造函数的引用类型的默认构造函数。对于没有实现构造函数的引用类型,我想它可能会返回null。但是,要弄清楚如何在if-else中调用new T((vs default(T(是很困难的,编译器说它没有正确的约束(当然,因为约束是在运行时检查的(。
作为一种选择,我想我可以用Jon Skeet的http://msmvps.com/blogs/jon_skeet/archive/2010/11/02/evil-code-overload-resolution-workaround.aspx关于Get-helper方法(他说:
这可能是我写过的最可怕的代码。
请不要在现实生活中使用它。使用不同的方法名称或者类似的东西。尽管如此,这还是一个有趣的小谜题,不是吗?
)作为一个好处,它可能允许我在没有默认构造函数的情况下强制引用类型指定非可选的init-Func。
您可以尝试这种方法。我似乎想不出更好的方法来返回可为null类型的基础类型的默认值。如果我发现什么,我会继续搜索并更新我的帖子。但是,如果没有无参数构造函数,就不能传递引用类型。
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()
约束的情况下使用此版本,该约束在所有情况下都使用反射,因此速度较慢。
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));
}