public Property Get <Property>(Expression <Func <T, Property> > expression)
    {
        var propName = NotifyPropertyChangedHelper.GetPropertyName(expression);

        if (!properties.ContainsKey(propName))
        {
            properties.Add(propName, GetDefault <Property>());
        }
        return((Property)properties[propName]);
    }
    public bool Set <Property>(Expression <Func <T, Property> > expression, Property newValue)
    {
        var propName = NotifyPropertyChangedHelper.GetPropertyName(expression);

        if (!properties.ContainsKey(propName))
        {
            properties.Add(propName, newValue);
            propertyContainer.RaisePropertyChangedEvent(propName);
        }
        else
        {
            if (EqualityComparer <Property> .Default.Equals((Property)properties[propName], newValue))
            {
                return(false);
            }
            properties[propName] = newValue;
            propertyContainer.RaisePropertyChangedEvent(propName);
        }
        return(true);
    }