【问题标题】:in c# how to implement typeof(entity) inside generic class在 C# 中如何在泛型类中实现 typeof(entity)
【发布时间】:2016-02-01 15:13:42
【问题描述】:

我想要达到的目标:

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

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

【问题讨论】:

  • 您的问题有点不清楚,但您的代码 sn-p 的正确语法是 _unitofwork.BaseRepositoryFor&lt;Entity&gt;。如果您的方法也是泛型的,带有一个名为T 的泛型参数,那么_unitofwork.BaseRepositoryFor&lt;T&gt;
  • 我的方法是通用的 并且我不能在我的方法中使用 因为用户请求将被接收为 Type type= typeof(something);我需要在我的通用方法中使用“类型”
  • 如果你的类型是T,你可以直接传下去var result =_unitofwork.BaseRepositoryFor&lt;T&gt;.createEntity(entity);
  • 不,不幸的是我的类型不是 T

标签: c# generics typeof


【解决方案1】:

我相信你需要的是MakeGenericType:

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

现在你可以通过反射调用实际的方法了:

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

【讨论】:

  • 感谢您的回答。但你能告诉我这里的“inferedType”是什么吗?
  • 它是你在&lt;&gt;中的类型,所以你的泛型类型。
  • 当我运行测试代码时,测试运行器甚至无法识别解决方案的 4h 行。
  • @HimBromBeere 就在这里,MakeGenericType 是要走的路。
【解决方案2】:
public Type GetSome<T>(T intake)
{
            T localT = default(T);

}

我相信这就是您正在寻找的。 从这一点开始,您可以使用localT 做任何您需要的事情

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

    • 不是方法是通用的,而是类型。
    猜你喜欢
    • 1970-01-01
    • 2011-11-07
    • 1970-01-01
    • 1970-01-01
    • 2012-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多