public PropertyCondition(Mobile from, Type type, PropertyInfo[] props, string prop, string oper, string arg, bool logicalNot)
{
m_From = from;
m_LogicalNot = logicalNot;
string failReason = "";
m_PropertyInfoChain = Properties.GetPropertyInfoChain(from, type, prop, true, ref failReason);
if (m_PropertyInfoChain == null)
{
throw new Exception(failReason);
}
/*for ( int i = 0; i < props.Length; ++i )
* {
* PropertyInfo check = props[i];
*
* if ( !Insensitive.Equals( check.Name, prop ) )
* continue;
*
* m_Property = check;
* break;
* }
*
* if ( m_Property == null )
* throw new Exception( String.Format( "No property with the name ({0}) was found on type ({1}).", prop, type.Name ) );
*
* CPA attr = Properties.GetCPA( m_Property );
*
* if ( attr == null )
* throw new Exception( String.Format( "No property with the name ({0}) was found on type ({1}).", prop, type.Name ) );
*
* if ( from.AccessLevel < attr.ReadLevel )
* throw new Exception( String.Format( "Getting this property ({0}) requires at least {1} access level.", prop, Mobile.GetAccessLevelName( attr.ReadLevel ) ) );*/
string error = Properties.ConstructFromString(m_PropertyInfoChain[m_PropertyInfoChain.Length - 1].PropertyType, null, arg, ref m_Argument);
if (error != null)
{
throw new Exception(error);
}
switch (oper)
{
case "=":
case "==":
case "is": m_Operator = ConditionOperator.Equality; break;
case "!=": m_Operator = ConditionOperator.Inequality; break;
case ">": m_Operator = ConditionOperator.Greater; break;
case "<": m_Operator = ConditionOperator.Lesser; break;
case ">=": m_Operator = ConditionOperator.GreaterEqual; break;
case "<=": m_Operator = ConditionOperator.LesserEqual; break;
case "==~":
case "~==":
case "=~":
case "~=":
case "is~":
case "~is": m_Operator = ConditionOperator.EqualityInsensitive; break;
case "!=~":
case "~!=": m_Operator = ConditionOperator.InequalityInsensitive; break;
case "starts": m_Operator = ConditionOperator.StartsWith; break;
case "starts~":
case "~starts": m_Operator = ConditionOperator.StartsWithInsensitive; break;
case "ends": m_Operator = ConditionOperator.EndsWith; break;
case "ends~":
case "~ends": m_Operator = ConditionOperator.EndsWithInsensitive; break;
case "contains": m_Operator = ConditionOperator.Contains; break;
case "contains~":
case "~contains": m_Operator = ConditionOperator.ContainsInsensitive; break;
}
if (m_Operator != ConditionOperator.Equality && m_Operator != ConditionOperator.Inequality)
{
if (m_Argument != null && !(m_Argument is IComparable))
{
throw new Exception(String.Format("This property ({0}) is not comparable.", prop));
}
}
}