在 C# 中,如何在泛型类中实现 Typeof(entity)
本文关键字:Typeof entity 实现 泛型类 | 更新日期: 2023-09-27 18:32:49
我想要实现的目标:
Type type = typeof(Entity);
var result =_unitofwork.BaseRepositoryFor<type>.createEntity(entity);
我已经尝试了方法信息和更多示例,但最终无法正常工作。
CreateEntity/deleteEntity所有后端的东西都是通用实现的,但我需要在泛型方法中添加某种类型。
什么工作正常:
MyDb _db= new MyDb();
private static T entity;
private static BaseRepositoryFor<T>_dynamic_class = new BaseRepository<T>(_db);
var result =_unitofwork.BaseRepositoryFor<T>.createEntity(entity);
但是我需要在我的方法中键入对象而不是"T"。
重复问题:I已经检查了那个重复的问题。但它实际上并没有解决我的问题,因为我有一些扩展方法来创建/删除/更新/获取,我需要在智能中获取这些方法名称。
我相信你需要的是MakeGenericType:
var t = typeof(BaseRepositoryFor<>)
Type constructed = t.MakeGenericType(inferedType);
现在,您可以通过反射调用实际方法:
var m = constructed.GetMethod("createEntity");
var result = m.Invoke(null, new[] { entity });
public Type GetSome<T>(T intake)
{
T localT = default(T);
}
我相信这就是你要找的。从这一点开始,你可以用localT
做任何你需要的事情
您必须在类中创建一个泛型方法。如果可能,请使用外部的泛型参数调用它。或者,您可以通过反射调用泛型方法,但请注意,这很慢。我在下面给你一个非常原始的,不是很易于维护的例子,但你会看到这一点:
private TEntity MyMethodGeneric<TEntity>(){
return _unitofwork.BaseRepositoryFor<TEntity>.createEntity(entity);
}
private object MyMethod(Type type){
var method = GetType().GetMethod("MyMethodGeneric", BindingFlags.Instance|BindingFlags.NonPublic);
return method.MakeGenericMethod(type).Invoke(this, new object[]{/* if you need to pass parameters}*/);
}
同样,如果可以的话,我会尽量避免这种情况。在更高级别传入泛型参数。如果你绝对必须使用这种模式,你应该看看你是否可以让它更好地维护,例如,通过不对方法名称进行硬编码,甚至通过缓存实际方法(MakeGenericMethod
非常慢)。