代码之家  ›  专栏  ›  技术社区  ›  Zachary Scott

给定一个泛型<E>如何创建一个新的E并返回它?

  •  1
  • Zachary Scott  · 技术社区  · 14 年前

    这段代码返回一组变量字段,我想返回一个强类型 <E> :

    public IList<E> Get(Expression<Func<E, object>> selectLambda == null)
    {
        if (selectLambda == null)
            selectLambda = p => p;
        var partialSet = DC.CreateQuery<E>("[" + typeof(E).Name + "]");
        foreach ( var record in partialSet)
        {
            var tempEntity = new E();  // This is the error
            MapIt( record, tempContract);
            result.Add(tempContract);
        }
        return result;
    }
    
    4 回复  |  直到 14 年前
        1
  •  3
  •   Jon Skeet    14 年前

    最简单的方法是添加约束:

    public IList<E> Get(Expression<Func<E, object>> selectLambda == null)
        where E : new()
    

    如果不能在那里使用约束(例如,因为它们会传播到所有地方),但碰巧知道它在执行时会工作,则可以使用:

    var tempEntity = Activator.CreateInstance<E>();
    
        2
  •  2
  •   Matthias Meid    14 年前

    public IList<E> Get() where E : new()
    

    这样就可以确保E确实有一个无参数的构造函数。

    干杯

        3
  •  1
  •   TomTom    14 年前

    E必须根据泛型约束支持new()定义(即E必须是“:new()”)

        4
  •  0
  •   Andrew Bezzub    14 年前

    如果E没有空的构造函数,您可以将委托传递给您的方法,您可以使用它来创建E。在这种情况下,方法的调用方将负责传递正确的委托。

    public IList<E> Get(Expression<Func<E, object>> selectLambda == null, Func<E> creator)
    {
        // ...
        var tempEntity = creator();  
        // ...
    }