我有一个像这样的界面
public interface INetworkPacketEventHandler
{
int Id { get; }
Task HandleAsync(INetworkClient client, INetworkPacketReader reader);
}
我想获得一个
Dictionary<short, Type>
,这样我以后就可以知道要从标识符创建哪个处理程序。
我有这个,但它总是返回一个空的 IEnumerable
var types =
from type in Assembly.GetExecutingAssembly().GetTypes()
where type.IsDefined(typeof(INetworkPacketEventHandler), true)
select new KeyValuePair<short, Type>((short)type.GetProperty("Id").GetValue(type), type);
您需要使用
IsAssignableFrom
而不是 IsDefined
。 IsDefined
检查成员上是否定义了属性。对于 iterface 实现,您可以使用 IsAssignableFrom
检查。
另请注意,使用 GetValue
需要类型的 object,而不是类型本身。您可以使用 Activator.CreateInstance
创建对象。
所以你的代码应该如下所示:
var types =
from type in Assembly.GetExecutingAssembly().GetTypes()
where type.IsAssignableFrom(typeof(INetworkPacketEventHandler))
select new KeyValuePair<short, Type>((short)type.GetProperty("Id").GetValue(Activator.CreateInstance(type)), type);