如何允许getter helper的默认初始化程序重载

时间:2013-01-02 13:05:23

标签: c# inotifypropertychanged getter optional-parameters

我决定在我的ViewModelBaseClass中添加自定义Get / SetValue(带有INotifyPropertyChanged)辅助函数,类似于提到的类型安全方法here。但是我想在Get helper Function中添加可选的初始化程序,它具有合理的默认值。不幸的是,default关键字将引用类型初始化为null,将可空值类型初始化为null,将值类型初始化为默认值。

我想创建一个泛型函数,它将由Get帮助程序调用,它返回类型的默认值,BaseType为Nullable的默认值值(如果可能),以及具有默认构造函数的引用类型的默认构造函数。 对于没有实现构造函数的引用类型,我猜它可以返回null。但是如果想知道如何在if中调用新的T()vs default(T)是困难的,编译器说它没有正确的约束(因为当然在运行时检查约束)。

作为替代方案,我想我可以在Get辅助方法上使用Jon Skeet的http://msmvps.com/blogs/jon_skeet/archive/2010/11/02/evil-code-overload-resolution-workaround.aspx(   其中他说:

  

这可能是我写过的最恐怖的代码。

     

请不要在现实生活中使用它。使用不同的方法名称   或类似的东西。   不过,这是一个有趣的小谜题,不是吗?

)作为一个好处,它可能允许我在没有默认构造函数的情况下强制引用类型来指定非可选的init Func。

1 个答案:

答案 0 :(得分: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();
}

或者,您可以使用此版本而不使用在所有情况下都使用Reflection的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));
}