创建类型和属性值的字典?

问题描述 投票:0回答:1

我有一个像这样的界面

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);
c#
1个回答
0
投票

您需要使用

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);

© www.soinside.com 2019 - 2024. All rights reserved.