2010-10-28 23 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(); 
    // ... 
} 
相關問題