gpt4 book ai didi

c# - 使用反射在方法调用上获取正确的返回值

转载 作者:行者123 更新时间:2023-11-30 15:39:05 27 4
gpt4 key购买 nike

我的类中有以下通用方法作为存储库模式:

public DbSet<T> GetAll<T>() where T : class
{
return dbContext.Set<T>();
}

现在,我想获取数据库中属于实现特定接口(interface) (IChangeTrackingEntity) 的实体类的所有实体的列表。所以目前大约有 10 个特定的表/类符合这个,但我不想向这些表添加 10 个硬编码调用,所以我想用反射来代替(它也可能是实现的类这个接口(interface)将来会改变,我不想记住在这里也改变并使代码相互依赖)。

有效但我不想要的代码示例:

var result = new List<IChangeTrackingEntity>();
using ( var repository = new DbRepository())
{
result.AddRange( repository.GetAll<FirstTypeThatImplementsInterface>() );
result.AddRange( repository.GetAll<SecondTypeThatImplementsInterface>() );
result.AddRange( repository.GetAll<ThirdTypeThatImplementsInterface>() );
result.AddRange( repository.GetAll<FourthTypeThatImplementsInterface>() );
result.AddRange( repository.GetAll<FifthTypeThatImplementsInterface>() );
}
return result;

我已经很接近了,但是我无法得到最后一部分来转换 Invoke 的结果。回到正确的类型。我现在得到的是这个:

var result = new List<IChangeTrackingEntity>();
var method = typeof (DbRepository).GetMethod("GetAll");
using ( var repository = new DbRepository())
{
foreach (var p in typeof(AnchorDbContext).GetProperties())
{
if (p.PropertyType.IsGenericType && p.PropertyType.GetGenericTypeDefinition() == typeof(DbSet<>))
{
var pType = p.PropertyType.GetGenericArguments()[0];
if (pType.GetInterface("IChangeTrackingEntity") != null)
{
var genericMethod = method.MakeGenericMethod(new[] {pType});
result.AddRange(genericMethod.Invoke(repository, null) as DbSet<IChangeTrackingEntity>);
}
}
}
return result;
}

上面的问题是 Invoke 调用返回一个 object我需要将其转换为基本 DbSet<pType> .

在我当前的代码中 genericMethod.Invoke(repository, null) as DbSet<IChangeTrackingEntity>返回 null说明我不能随心所欲地转换返回值,所以我需要具体的返回值类型,而不是我认为的接口(interface)。

知道如何实现吗?

最佳答案

尝试转换到 IEnumerable<IChangeTrackingEntity> .由于协变/逆变,这应该有效。

关于c# - 使用反射在方法调用上获取正确的返回值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10817233/

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