public static GetPropertyInfoChain ( Mobile from, |
||
from | Mobile | |
type | ||
propertyString | string | |
endAccess | PropertyAccess | |
failReason | string | |
return | System.Reflection.PropertyInfo[] |
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)); } } }
public override void ExecuteList(CommandEventArgs e, ArrayList list) { if (list.Count == 0) { LogFailure("Nothing was found to use this command on."); return; } try { BaseCommand[] commands = new BaseCommand[BatchCommands.Count]; CommandEventArgs[] eventArgs = new CommandEventArgs[BatchCommands.Count]; for (int i = 0; i < BatchCommands.Count; ++i) { BatchCommand bc = (BatchCommand)BatchCommands[i]; string commandString, argString; string[] args; bc.GetDetails(out commandString, out argString, out args); BaseCommand command = Scope.Commands[commandString]; commands[i] = command; eventArgs[i] = new CommandEventArgs(e.Mobile, commandString, argString, args); if (command == null) { e.Mobile.SendMessage("That is either an invalid command name or one that does not support this modifier: {0}.", commandString); return; } else if (e.Mobile.AccessLevel < command.AccessLevel) { e.Mobile.SendMessage("You do not have access to that command: {0}.", commandString); return; } else if (!command.ValidateArgs(Scope, eventArgs[i])) { return; } } for (int i = 0; i < commands.Length; ++i) { BaseCommand command = commands[i]; BatchCommand bc = (BatchCommand)BatchCommands[i]; if (list.Count > 20) { CommandLogging.Enabled = false; } ArrayList usedList; if (Utility.InsensitiveCompare(bc.Object, "Current") == 0) { usedList = list; } else { Hashtable propertyChains = new Hashtable(); usedList = new ArrayList(list.Count); for (int j = 0; j < list.Count; ++j) { object obj = list[j]; if (obj == null) { continue; } Type type = obj.GetType(); PropertyInfo[] chain = (PropertyInfo[])propertyChains[type]; string failReason = ""; if (chain == null && !propertyChains.Contains(type)) { propertyChains[type] = chain = Properties.GetPropertyInfoChain(e.Mobile, type, bc.Object, PropertyAccess.Read, ref failReason); } if (chain == null) { continue; } PropertyInfo endProp = Properties.GetPropertyInfo(ref obj, chain, ref failReason); if (endProp == null) { continue; } try { obj = endProp.GetValue(obj, null); if (obj != null) { usedList.Add(obj); } } catch { } } } command.ExecuteList(eventArgs[i], usedList); if (list.Count > 20) { CommandLogging.Enabled = true; } command.Flush(e.Mobile, list.Count > 20); } } catch (Exception ex) { e.Mobile.SendMessage(ex.Message); } }
public override void ExecuteList(CommandEventArgs e, List <object> list) { if (list.Count == 0) { LogFailure("Nothing was found to use this command on."); return; } try { var commands = new BaseCommand[BatchCommands.Count]; var eventArgs = new CommandEventArgs[BatchCommands.Count]; for (var i = 0; i < BatchCommands.Count; ++i) { var bc = BatchCommands[i]; bc.GetDetails(out var commandString, out var argString, out var args); var command = Scope.Commands[commandString]; commands[i] = command; eventArgs[i] = new CommandEventArgs(e.Mobile, commandString, argString, args); if (command == null) { e.Mobile.SendMessage( "That is either an invalid command name or one that does not support this modifier: {0}.", commandString ); return; } if (e.Mobile.AccessLevel < command.AccessLevel) { e.Mobile.SendMessage("You do not have access to that command: {0}.", commandString); return; } if (!command.ValidateArgs(Scope, eventArgs[i])) { return; } } for (var i = 0; i < commands.Length; ++i) { var command = commands[i]; var bc = BatchCommands[i]; if (list.Count > 20) { CommandLogging.Enabled = false; } List <object> usedList; if (Utility.InsensitiveCompare(bc.Object, "Current") == 0) { usedList = list; } else { var propertyChains = new Dictionary <Type, PropertyInfo[]>(); usedList = new List <object>(list.Count); for (var j = 0; j < list.Count; ++j) { var obj = list[j]; if (obj == null) { continue; } var type = obj.GetType(); var failReason = ""; if (!propertyChains.TryGetValue(type, out var chain)) { propertyChains[type] = chain = Properties.GetPropertyInfoChain( e.Mobile, type, bc.Object, PropertyAccess.Read, ref failReason ); } if (chain == null) { continue; } var endProp = Properties.GetPropertyInfo(ref obj, chain, ref failReason); if (endProp == null) { continue; } try { obj = endProp.GetValue(obj, null); if (obj != null) { usedList.Add(obj); } } catch { // ignored } } } command.ExecuteList(eventArgs[i], usedList); if (list.Count > 20) { CommandLogging.Enabled = true; } command.Flush(e.Mobile, list.Count > 20); } } catch (Exception ex) { e.Mobile.SendMessage(ex.Message); } }