2010-10-28 44 views
1

此代码返回可变字段集的,我想返回一个强类型<E>鉴于通用<E>如何创建一个新的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; 
} 
+0

重复http://stackoverflow.com/questions/840261/c-generic-new-constructor-problem ...? – JeffFerguson 2010-10-28 15:24:58

回答

3

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

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

那么你的代码的其余部分将编译:)

如果你不能在那里使用约束(例如因为他们会传播所有的地方),但您知道它会在执行时上班,你可以使用:

var tempEntity = Activator.CreateInstance<E>(); 
+0

如果您有公共类MyClass :IClass :其中E:EntityObject,然后再有您的代码。编译器错误是“在非泛型声明中不允许约束” – 2010-10-28 15:32:22

+0

这是一个非常好的答案。 TYVM – 2010-10-28 15:38:46

+0

@Dr。 Zim:我假设你现在已经整理出你的第一个错误了? (基本上你有一个额外的冒号)。 – 2010-10-28 16:16:33

1

E必须支持新的()的定义按照通​​用的限制(即e必须“:新的()” )

2

你需要针对E约束:

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

这样你确保E有一个无参数的构造函数。

干杯 马蒂亚斯

0

如果E没有空的构造函数,你可以通过委托给你的方法,你可以用它来创建E.在该方法的这种情况下,主叫方将负责通过适当的委托。

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