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>(此项为输入包)