gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 12:19:48 28 4
gpt4 key购买 nike

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

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

我能给个提示吗?

最佳答案

类型ICommandHandler<>本身并不是真正的接口(interface)。例如,你永远不能给它分配任何东西。它是一个类型定义,有时也称为开放通用类型。

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

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

关于c# 最安全的方法检查一个类型是否在其接口(interface)中包含一个类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55544701/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com