gpt4 book ai didi

c# - 如何通过泛型获取接口(interface)的具体实现?

转载 作者:太空狗 更新时间:2023-10-30 00:27:13 27 4
gpt4 key购买 nike

我需要一些帮助来弄清楚如何使用反射来获取基于 Dto 类型的具体实现:

public interface IDocumentService<TDto>
{
}

public interface ICommentService: IDoumentService<CommentDto>
{
}

public abstract class DocumentService<TEntity,TDto>: IDocumentService<TDto> where TEntity: Entity, where TDto: Dto
{
}

public class CommentService: DocumentService<Comment,CommentDto>, ICommentService
{
}

所以,我想做的是将 CommentDto 传递给一个方法,以便我可以访问 CommentService。

public IDocumentService<TDto> GetDocumentService<TDto>()
{
//based on the TDto type I want to find the concrete that
//implements IDocumentService<TDto>
}

我会这样调用它:

var commentDocumentService = GetDocumentService<CommentDto>();

因此,我会返回 CommentService,因为我知道我只会看到 IDocumentService 接口(interface)的方法部分。

最佳答案

这是 GetDocumentService 的一个可能实现。

    public static IDocumentService<TDto> GetDocumentService<TDto>()
{
// Gets the type for IDocumentService
Type tDto=typeof(IDocumentService<TDto>);
Type tConcrete=null;
foreach(Type t in Assembly.GetExecutingAssembly().GetTypes()){
// Find a type that implements tDto and is concrete.
// Assumes that the type is found in the executing assembly.
if(tDto.IsAssignableFrom(t) && !t.IsAbstract && !t.IsInterface){
tConcrete=t;
break;
}
}
// Create an instance of the concrete type
object o=Activator.CreateInstance(tConcrete);
return (IDocumentService<TDto>)o;
}

不清楚您是否想返回一个新对象,所以我假设是。

编辑:

由于您的评论,这里是 GetDocumentService 的修改版本。缺点是您需要指定另一个类型参数。不过,优点是这种方法提供了一定程度的类型安全性,因为两种类型参数必须兼容。

    public static T GetDocumentService<TDto, T>() where T : IDocumentService<TDto>
{
// Gets the type for IDocumentService
Type tDto=typeof(T);
Type tConcrete=null;
foreach(Type t in Assembly.GetExecutingAssembly().GetTypes()){
// Find a type that implements tDto and is concrete.
// Assumes that the type is found in the calling assembly.
if(tDto.IsAssignableFrom(t) && !t.IsAbstract && !t.IsInterface){
tConcrete=t;
break;
}
}
// Create an instance of the concrete type
object o=Activator.CreateInstance(tConcrete);
return (T)o;
}

编辑 2:

如果我没理解错的话,你是想通过GetDocumentService的返回值类型获取其他实现的接口(interface)。例如,GetDocumentService<CommentDto>返回 CommentService 类型的对象实现了 ICommentService界面。如果我理解正确的话,返回值应该是一个 Type 对象(例如,返回值可以是 typeof(ICommentService) )。一旦你有了类型,你应该调用类型的 FullName属性以获取类型的名称。

GetDocumentService的返回值使用下面的方法获取由该值实现的接口(interface)类型,例如 typeof(ICommentService) .

    public static Type GetDocumentServiceType<TDto>(IDocumentService<TDto> obj){
Type tDto=typeof(IDocumentService<TDto>);
foreach(Type iface in obj.GetType().GetInterfaces()){
if(tDto.IsAssignableFrom(iface) && !iface.Equals(tDto)){
return iface;
}
}
return null;
}

关于c# - 如何通过泛型获取接口(interface)的具体实现?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7387819/

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