1

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

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

作为替代方案,我想我可以在 Get helper方法(其中他说:

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

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

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

4

1 回答 1

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()在所有情况下都使用反射的约束,因此速度较慢。

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));
}
于 2013-01-02T13:14:15.243 回答