c#最安全的方法检查类型是否在其接口中包含类型

时间:2019-04-06 00:05:22

标签: c# reflection

在运行时比较两种类型的最安全方法是什么?

public interface IHandler<T> where T : Command {

}

public class CleanupHandler : IHandler<CleanupCommand> {
}

var Handlers = GetServices(typeof(IHandler<Cleanup>));


static IEnumerable<object> GetServices(Type serviceType) {
            var services= _services.Where(r => r.implementationType.GetInterfaces().Contains(serviceType)) /* issue here */
                                   .Select(r => r.implementation);

            return services;
 }

_services

的可枚举
public class Metadata {
    public Type serviceType { get; protected set; }
    public Type implementationType { get; protected set; }
    public object implementation { get; protected set; }
}

如果我们从更改支票:

r.implementationType.GetInterfaces().Contains(serviceType)

r.implementationType.GetInterfaces().Count(x => x.Name == serviceType.Name) > 0

它可以工作,但是那根本不安全,类型的确相同,但是不起作用。

编辑:

namespace ConsoleApp {
    class Command {

    }

    interface ICommandHandler<T> where T : Command {

    }

    class Cleanup : Command {

    }

    class CleanupHandler: ICommandHandler<Cleanup> {

    }

    class Program {
        static void Main(string[] args) {

            var types = Assembly.GetExecutingAssembly().GetExportedTypes()
                .Where(r => r.GetInterfaces().Contains(typeof(ICommandHandler<>)));

            Console.ReadKey();
        }
    }
}

我可以提示吗?

1 个答案:

答案 0 :(得分:2)

类型ICommandHandler<>本身并不是一个接口。例如,您永远无法为其分配任何内容。这是一个类型定义,有时也称为开放通用类型。

我认为您正在寻找类型定义为ICommandHandler<>的任何类型。如果是这样,我想你想要

var types = Assembly.GetExecutingAssembly()
    .GetExportedTypes()
    .Where
    (
        r => r.GetInterfaces().Any
        (
            i => i.IsGenericType 
              && i.GetGenericTypeDefinition() == typeof(ICommandHandler<>)
        )
    );