Просто чтобы завершить список, я использую эту функцию. В нем есть все операторы. Лучше не использовать eval (). Это будет намного быстрее и безопаснее.
*--------------------------------------------------------------------------
* checks 2 values with operator
* you can use logical operators als well
* returns FALSE or TRUE
*/
function checkOperator($value1, $operator, $value2) {
switch ($operator) {
case '<': // Less than
return $value1 < $value2;
case '<=': // Less than or equal to
return $value1 <= $value2;
case '>': // Greater than
return $value1 > $value2;
case '>=': // Greater than or equal to
return $value1 >= $value2;
case '==': // Equal
return $value1 == $value2;
case '===': // Identical
return $value1 === $value2;
case '!==': // Not Identical
return $value1 !== $value2;
case '!=': // Not equal
case '<>': // Not equal
return $value1 != $value2;
case '||': // Or
case 'or': // Or
return $value1 || $value2;
case '&&': // And
case 'and': // And
return $value1 && $value2;
case 'xor': // Or
return $value1 xor $value2;
default:
return FALSE;
} // end switch
Называть это:
$value1 = 12;
$operator = '>';
$value2 = 13;
if (checkOperator($value1, $operator, $value2)) {
... its true
} else {
... its not true
}
Первая мысль - я еще не до конца обдумал это, но это кажется разумной возможностью:
public class LogEvent
{
/* This is the event code you reference from your code
* so you're not working with magic numbers. It will work
* much like an enum */
public string Code;
/* This is the event id that's published to the event log
* to allow simple filtering for specific events */
public int Id;
/* This is a predefined string format that allows insertion
* of variables so you can have a descriptive text template. */
public string DisplayFormat;
/* A constructor to allow you to add items to a collection in
* a single line of code */
public LogEvent(int id, string code, string displayFormat)
{
Code = code;
Id = id;
DisplayFormat = displayFormat;
}
public LogEvent(int id, string code)
: this(id, code, null)
{
}
public LogEvent()
{
}
}
Затем у вас может быть класс диспетчера событий, который обертывает ваш список событий, обеспечивая метод, который запрашивает список в соответствии с переданным вами параметром - например:
public class EventManager
{
private List<LogEvent> _eventList;
public LogEvent this[string eventCode]
{
get
{
return _eventList.Where(i => i.Code.Equals(eventCode)).SingleOrDefault();
}
}
public LogEvent this[int id]
{
get
{
return _eventList.Where(i => i.Id.Equals(id)).SingleOrDefault();
}
}
public void AddRange(params LogEvent[] logEvents)
{
Array.ForEach(logEvents, AddEvent);
}
public void Add(int id, string code)
{
AddEvent(new LogEvent(id, code));
}
public void Add(int id, string code, string displayFormat)
{
AddEvent(new LogEvent(id, code, displayFormat));
}
public void Add(LogEvent logEvent)
{
_events.Add(logEvent);
}
public void Remove(int id)
{
_eventList.Remove(_eventList.Where(i => i.id.Equals(id)).SingleOrDefault());
}
public void Remove(string code)
{
_eventList.Remove(_eventList.Where(i => i.Code.Equals(code)).SingleOrDefault());
}
public void Remove(LogEvent logEvent)
{
_eventList.Remove(logEvent);
}
}
Это позволяет упростить управление определениями событий, которыми можно управлять независимо для каждого TraceSource.
var Events = new EventManager();
Events.AddRange(
new LogEvent(1, "BuildingCommandObject", "Building command object from {0}."),
new LogEvent(2, "CommandObjectBuilt", "Command object built successfully."),
new LogEvent(3, "ConnectingToDatabase", "Connecting to {0}."),
new LogEvent(4, "ExecutingCommand", "Executing command against database {0}".),
new LogEvent(5, "CommandExecuted", "Command executed succesfully."),
new LogEvent(6, "DisconnectingFromDatabase", "Disconnecting from {0}."),
new LogEvent(7, "Disconnected", "Connection terminated.")
)
И вы можете получить доступ к событиям, используя значимый идентификатор, который вы назначили :
var evt = Events["ConnectingToDatabase"];
TraceSource.TraceEvent(TraceEventType.Information, evt.Id, evt.DisplayFormat, otherParams);
или
var evt = Events[1024];
Console.WriteLine("Id: {1}{0}Code: {2}{0}DisplayFormat{3}",
Environment.NewLine, evt.Id, evt.Code, evt.DisplayFormat);
Это, вероятно, упростило бы ваше управление событиями, вы больше не вызываете свои события магическими числами, все ваши события просто управляются в одном месте - ваш класс EventManager, и вы по-прежнему можете фильтровать журнал событий по магическим числам, по которым требуется фильтрация.
Как и предложение Бена, вероятно, стоит использовать уровень косвенности - но вместо использования int для кода я бы использовал реальное перечисление, поэтому для примера Бена:
public enum EventId
{
[Format("Building command object from {0}.")]
BuildingCommandObject = 1,
[Format("Command object build successfully.")]
CommandObjectBuilt = 2,
[Format("Connecting to {0}.")]
ConnectingToDatabase = 3,
[Format("Executing command against database {0}.")]
ExecutingCommand = 4,
[Format("Command executed successfully.")]
CommandExecuted = 5,
[Format("Disconnecting from {0}.")]
DisconnectingFromDatabase = 6,
[Format("Connection terminated")]
Disconnected = 7
}
Или в качестве альтернативы (и в более объектно-ориентированной манере) используйте шаблон «умное перечисление»):
public class LogEvent
{
public static readonly LogEvent BuildingCommandObject = new LogEvent(1,
"Building command object from {0}");
// etc
private readonly int id;
private readonly string format;
// Add the description if you want
private LogEvent(int id, string format)
{
this.id = id;
this.format = format;
}
public void Log(params object[] data)
{
string message = string.Format(format, data);
// Do the logging here
}
}
Затем вы можете позвонить:
LogEvent.BuildingCommandObject.Log("stuff");
Немного поработав, вы можете раскрыть это в безопасный способ с различными событиями журнала, имеющими другой интерфейс, чтобы сделать его безопасным (во время компиляции) с точки зрения количества параметров, которые имеет каждый из них. На самом деле я уверен, что вы могли бы сделать это, используя интерфейсы и частный вложенный класс, но сейчас 4 часа ночи, и я слишком устал, чтобы писать это atm :)