Files
Flee/PublicTypes/ExpressionOptions.cs

210 lines
6.3 KiB
C#

using System.Reflection;
using System.Globalization;
using Flee.InternalTypes;
using System;
using System.Collections.Generic;
namespace Flee.PublicTypes
{
public sealed class ExpressionOptions
{
private PropertyDictionary _myProperties;
private Type _myOwnerType;
private readonly ExpressionContext _myOwner;
internal event EventHandler CaseSensitiveChanged;
internal ExpressionOptions(ExpressionContext owner)
{
_myOwner = owner;
_myProperties = new PropertyDictionary();
this.InitializeProperties();
}
#region "Methods - Private"
private void InitializeProperties()
{
this.StringComparison = System.StringComparison.Ordinal;
this.OwnerMemberAccess = BindingFlags.Public;
_myProperties.SetToDefault<bool>("CaseSensitive");
_myProperties.SetToDefault<bool>("Checked");
_myProperties.SetToDefault<bool>("EmitToAssembly");
_myProperties.SetToDefault<Type>("ResultType");
_myProperties.SetToDefault<bool>("IsGeneric");
_myProperties.SetToDefault<bool>("IntegersAsDoubles");
_myProperties.SetValue("ParseCulture", CultureInfo.CurrentCulture);
this.SetParseCulture(this.ParseCulture);
_myProperties.SetValue("RealLiteralDataType", RealLiteralDataType.Double);
}
private void SetParseCulture(CultureInfo ci)
{
ExpressionParserOptions po = _myOwner.ParserOptions;
po.DecimalSeparator = Convert.ToChar(ci.NumberFormat.NumberDecimalSeparator);
po.FunctionArgumentSeparator = Convert.ToChar(ci.TextInfo.ListSeparator);
po.DateTimeFormat = ci.DateTimeFormat.ShortDatePattern;
}
#endregion
#region "Methods - Internal"
internal ExpressionOptions Clone()
{
ExpressionOptions clonedOptions = (ExpressionOptions)this.MemberwiseClone();
clonedOptions._myProperties = _myProperties.Clone();
return clonedOptions;
}
internal bool IsOwnerType(Type t)
{
return this._myOwnerType.IsAssignableFrom(t);
}
internal void SetOwnerType(Type ownerType)
{
_myOwnerType = ownerType;
}
#endregion
#region "Properties - Public"
public Type ResultType
{
get { return _myProperties.GetValue<Type>("ResultType"); }
set
{
Utility.AssertNotNull(value, "value");
_myProperties.SetValue("ResultType", value);
}
}
public bool Checked
{
get { return _myProperties.GetValue<bool>("Checked"); }
set { _myProperties.SetValue("Checked", value); }
}
public StringComparison StringComparison
{
get { return _myProperties.GetValue<StringComparison>("StringComparison"); }
set { _myProperties.SetValue("StringComparison", value); }
}
public bool EmitToAssembly
{
get { return _myProperties.GetValue<bool>("EmitToAssembly"); }
set { _myProperties.SetValue("EmitToAssembly", value); }
}
public BindingFlags OwnerMemberAccess
{
get { return _myProperties.GetValue<BindingFlags>("OwnerMemberAccess"); }
set { _myProperties.SetValue("OwnerMemberAccess", value); }
}
public bool CaseSensitive
{
get { return _myProperties.GetValue<bool>("CaseSensitive"); }
set
{
if (this.CaseSensitive != value)
{
_myProperties.SetValue("CaseSensitive", value);
if (CaseSensitiveChanged != null)
{
CaseSensitiveChanged(this, EventArgs.Empty);
}
}
}
}
public bool IntegersAsDoubles
{
get { return _myProperties.GetValue<bool>("IntegersAsDoubles"); }
set { _myProperties.SetValue("IntegersAsDoubles", value); }
}
public CultureInfo ParseCulture
{
get { return _myProperties.GetValue<CultureInfo>("ParseCulture"); }
set
{
Utility.AssertNotNull(value, "ParseCulture");
if ((value.LCID != this.ParseCulture.LCID))
{
_myProperties.SetValue("ParseCulture", value);
this.SetParseCulture(value);
_myOwner.ParserOptions.RecreateParser();
}
}
}
public RealLiteralDataType RealLiteralDataType
{
get { return _myProperties.GetValue<RealLiteralDataType>("RealLiteralDataType"); }
set { _myProperties.SetValue("RealLiteralDataType", value); }
}
#endregion
#region "Properties - Non Public"
internal IEqualityComparer<string> StringComparer
{
get
{
if (this.CaseSensitive == true)
{
return System.StringComparer.Ordinal;
}
else
{
return System.StringComparer.OrdinalIgnoreCase;
}
}
}
internal MemberFilter MemberFilter
{
get
{
if (this.CaseSensitive == true)
{
return Type.FilterName;
}
else
{
return Type.FilterNameIgnoreCase;
}
}
}
internal StringComparison MemberStringComparison
{
get
{
if (this.CaseSensitive == true)
{
return System.StringComparison.Ordinal;
}
else
{
return System.StringComparison.OrdinalIgnoreCase;
}
}
}
internal Type OwnerType => _myOwnerType;
internal bool IsGeneric
{
get { return _myProperties.GetValue<bool>("IsGeneric"); }
set { _myProperties.SetValue("IsGeneric", value); }
}
#endregion
}
}