C#-反射和方法属性
我有一个名为C#-反射和方法属性,c#,reflection,C#,Reflection,我有一个名为NetworkEventAttribute的属性,它的属性中包含一个枚举,以便我可以识别它 [AttributeUsage(AttributeTargets.Class)] public class NetworkEventAttribute : Attribute { public Messages Message { get; private set; } public NetworkEventAttribute(Messages message) {
NetworkEventAttribute
的属性,它的属性中包含一个枚举,以便我可以识别它
[AttributeUsage(AttributeTargets.Class)]
public class NetworkEventAttribute : Attribute
{
public Messages Message { get; private set; }
public NetworkEventAttribute(Messages message)
{
this.Message = message;
}
}
我有几个类继承自使用此属性标记的NetworkEvent
抽象类,每个类包含不同的枚举值,例如:
[NetworkEvent(Messages.SomeMessage)]
public class SomeEvent : NetworkEvent
{
public override void Handle(Client client)
}
public abstract class NetworkEvent
{
public Rider Rider { get; set; }
public Room Room { get; set; }
public abstract void Handle(Client client, InPacket inPacket);
}
现在。我想在基于给定枚举的类上调用Handle
。所以我知道我可以得到某个属性的所有方法,如下所示:
public static IEnumerable<Doublet<TAttribute, MethodInfo>> FindMethodsByAttribute<TAttribute>()
where TAttribute : Attribute
{
return
from a in AppDomain.CurrentDomain.GetAssemblies()
from t in a.GetTypes()
let attribute = t.GetCustomAttribute(typeof(TAttribute), false) as TAttribute
where attribute != null
select new Doublet<TAttribute, MethodInfo>(attribute, t.GetMethod("Handle"));
}
public NetworkEvent GetHandler(Messages message, Client client, InPacket inPacket)
{
if (!_handlers.ContainsKey(message))
return null;
NetworkEvent handler = (NetworkEvent)Activator.CreateInstance(_handlers[message]);
handler.Rider = client.Rider;
handler.Room = client.Rider?.Room;
return handler;
}
然后我就打电话:
var handler = Server.Instance.GetHandler(inPacket.Message, this, inPacket);
if (handler == null)
Console.WriteLine("Unhandled packet of type '{0}'.", inPacket.Message.ToString());
else
{
try
{
handler.GetType().GetMethod("Handle").Invoke(handler.GetType(), new object[2] { this, inPacket });
}
catch (Exception ex)
{
Console.WriteLine("Error while handling packet from {0}: \n{1}", this.Host, ex.ToString());
}
}
这是正确的方法吗?当前代码根据类型查找
MethodInfo
。设置属性值是在实例上执行的操作(这些不是静态属性)。向我们展示您调用方法的代码,在实例上调用方法之前设置这些属性应该很简单。您如何实际创建NetworkEvent
s?@odyss jii这是我的问题。我将返回MethodInfo,但这只适用于静态方法。我的问题是如何创建具有属性的类的实例并调用该方法。@Evk我添加到编辑中。这几乎没问题,只是您不需要执行handler.GetType().GetMethod(“Handle”)
,因为您的处理程序
已经是NetworkEvent
类型,所以您可以只调用handler.Handle>(此项为输入包)