在c#中如何在泛型类

时间:2016-02-01 15:13:42

标签: c# generics typeof

我想要实现的目标:

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'。

重复问题:我已经检查了重复的问题。但它实际上解决了我的问题,因为我有一些扩展方法来创建/删除/更新/获取,我需要在智能中获得这些方法的名称。

3 个答案:

答案 0 :(得分:1)

我相信你需要的是MakeGenericType

var t = typeof(BaseRepositoryFor<>)
Type constructed = t.MakeGenericType(inferedType);

现在您可以通过反射调用实际方法:

var m = constructed.GetMethod("createEntity");
var result = m.Invoke(null, new[] { entity });

答案 1 :(得分:0)

public Type GetSome<T>(T intake)
{
            T localT = default(T);

}

我相信这就是你要找的东西。 从这一点来说,您可以使用localT

做任何您需要的事情

答案 2 :(得分:0)

您必须在班级中创建通用方法。如果可能,请使用外部的generic参数调用它。或者,您可以通过反射调用泛型方法,但请注意,这很慢。我在下面给你一个非常原始的,不太可维护的例子,但你会看到这一点:

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非常慢)。