private void BuildFromAttributes() { Behaviors bhvs = new Behaviors(); // Launch reflexion MemberInfo[] memberInfo = GetType().GetMethods(); foreach (var mi in memberInfo) { #if NETCOREAPP1_1 BehaviorAttribute deco = (BehaviorAttribute)mi.GetType().GetTypeInfo().GetCustomAttribute(typeof(BehaviorAttribute)); #else BehaviorAttribute deco = (BehaviorAttribute)Attribute.GetCustomAttribute(mi, typeof(BehaviorAttribute)); #endif if (deco != null) { // add behavior if we can read this method var parameters = ((MethodInfo)mi).GetParameters(); if (parameters.Length == 1) { if (parameters[0].ParameterType == typeof(string)) { Behavior <string> bhv = new Behavior <string>(s => ((MethodInfo)mi).Invoke(this, new[] { s })); bhvs.AddBehavior(bhv); } } } } Become(bhvs); }
/// <summary> /// Handle the list information command. This command lists /// information about the core and all loaded behaviors. /// </summary> /// <param name="chatEvent"></param> private void HandleInfoCommand(ChatEvent chatEvent) { // Create the chat response message ChatPacket response = new ChatPacket(); // Set the player Identifier to reply to response.Event.PlayerId = chatEvent.PlayerId; response.Event.ChatType = ChatTypes.Private; Version coreVersion = Assembly.GetExecutingAssembly().GetName().Version; string strVersion = coreVersion.ToString(3); // Set up the header block response.Event.Message = "< =================================================================== >"; m_session.TransmitPacket(response); response.Event.Message = "< BattleCore version " + strVersion.PadRight(32) + " by udp >"; m_session.TransmitPacket(response); response.Event.Message = "< =================================================================== >"; m_session.TransmitPacket(response); response.Event.Message = "< Loaded Behavior Author Description >"; m_session.TransmitPacket(response); response.Event.Message = "< =================================================================== >"; m_session.TransmitPacket(response); // Send information about each loaded behavior foreach (Object behavior in m_core.LoadedBehaviors) { try { // Get the attributes for the listener object[] os = m_core.GetAttributes(behavior.GetType().ToString()); // Look for the behavior attribute foreach (object obj in os) { // If the object is a Behavior attribute if (obj is BehaviorAttribute) { // Build the behavior information from the attribute BehaviorAttribute ba = (obj as BehaviorAttribute); String strTitle = ba.Title + " " + ba.Version; response.Event.Message = "< " + strTitle.PadRight(24, ' ') + ba.Developers.PadRight(12, ' ') + ba.Description.PadRight(32, ' ') + ">"; m_session.TransmitPacket(response); } } } catch (Exception e) { // Send the exception message response.Event.Message = e.Message; m_session.TransmitPacket(response); } } // Close the information block response.Event.Message = "< =================================================================== >"; m_session.TransmitPacket(response); }
private void BuildFromAttributes() { Behaviors bhvs = new Behaviors(); // Launch reflexion MemberInfo[] memberInfo = GetType().GetMethods(BindingFlags.NonPublic | BindingFlags.Instance); foreach (var mi in memberInfo) { #if NETCOREAPP1_1 BehaviorAttribute deco = mi.GetCustomAttribute <BehaviorAttribute>(); #else BehaviorAttribute deco = (BehaviorAttribute)Attribute.GetCustomAttribute(mi, typeof(BehaviorAttribute)); #endif if (deco != null) { var parameters = ((MethodInfo)mi).GetParameters(); switch (parameters.Length) { case 0: { throw new ActorException(MessageCantUseDecoratedActporOnNullMessage); } case 1: { Behavior bhv = new Behavior( s => parameters[0].ParameterType.IsAssignableFrom(s.GetType()), s => ((MethodInfo)mi).Invoke(this, new[] { s })); bhvs.AddBehavior(bhv); break; } case 2: { Behavior bhv = new Behavior( s => { var ts = s.GetType(); return(ts.Name == typeof(MessageParam <,>).Name); }, s => { var ts = s.GetType(); var arg1 = ts.GetProperty("Item1").GetValue(s); var arg2 = ts.GetProperty("Item2").GetValue(s); ((MethodInfo)mi).Invoke(this, new[] { arg1, arg2 }); }); bhvs.AddBehavior(bhv); break; } case 3: { Behavior bhv = new Behavior( s => { var ts = s.GetType(); return(ts.Name == typeof(MessageParam <, ,>).Name); }, s => { var ts = s.GetType(); var arg1 = ts.GetProperty("Item1").GetValue(s); var arg2 = ts.GetProperty("Item2").GetValue(s); var arg3 = ts.GetProperty("Item3").GetValue(s); ((MethodInfo)mi).Invoke(this, new[] { arg1, arg2, arg3 }); }); bhvs.AddBehavior(bhv); break; } default: { throw new ActorException("Can't use Decorated Actor on too much arguments"); } } } } Become(bhvs); }
public static IEnumerable <IBehavior> BuildFromAttributes(IActor linkedActor) { CheckArg.Actor(linkedActor); var bhvs = new List <IBehavior>(); // Launch reflexion MemberInfo[] memberInfo = linkedActor.GetType().GetMethods(BindingFlags.NonPublic | BindingFlags.Instance); foreach (var mi in memberInfo) { #if NETCOREAPP1_1 BehaviorAttribute deco = mi.GetCustomAttribute <BehaviorAttribute>(); #else BehaviorAttribute deco = (BehaviorAttribute)Attribute.GetCustomAttribute(mi, typeof(BehaviorAttribute)); #endif if (deco != null) { var parameters = ((MethodInfo)mi).GetParameters(); switch (parameters.Length) { case 0: { throw new ActorException(MessageNullMessageOnDecoratedActor); } case 1: { Behavior bhv = new Behavior( s => parameters[0].ParameterType.IsAssignableFrom(s.GetType()), s => ((MethodInfo)mi).Invoke(linkedActor, new[] { s })); bhvs.Add(bhv); break; } case 2: { Behavior bhv = new Behavior( s => { return(s.GetType().Name == typeof(MessageParam <,>).Name); }, s => { var ts = s.GetType(); var arg1 = ts.GetProperty("Item1").GetValue(s); var arg2 = ts.GetProperty("Item2").GetValue(s); ((MethodInfo)mi).Invoke(linkedActor, new[] { arg1, arg2 }); }); bhvs.Add(bhv); break; } case 3: { Behavior bhv = new Behavior( s => { return(s.GetType().Name == typeof(MessageParam <, ,>).Name); }, s => { var ts = s.GetType(); var arg1 = ts.GetProperty("Item1").GetValue(s); var arg2 = ts.GetProperty("Item2").GetValue(s); var arg3 = ts.GetProperty("Item3").GetValue(s); ((MethodInfo)mi).Invoke(linkedActor, new[] { arg1, arg2, arg3 }); }); bhvs.Add(bhv); break; } default: { throw new ActorException(MessageTooMuchArgumentsOnDecoratedActor); } } } } return(bhvs); }