2010-10-28 5 views
1

Ce code renvoie un ensemble variable de champs et je veux revenir un fortement typé <E>:Étant donné un <E> générique comment créer un nouvel E et le retourner?

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

Duplicata de http://stackoverflow.com/questions/840261/c-generic-new-constructor-problem ...? – JeffFerguson

Répondre

3

la façon la plus simple est d'ajouter une contrainte:

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

Puis le reste de votre code compilera :)

Si vous ne pouvez pas utiliser de contraintes (par ex. parce qu'ils se propageraient dans tous les sens), mais il vous arrive de savoir que cela fonctionnera au moment de l'exécution, vous pouvez utiliser:

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

Que faire si vous avez la classe publique MyClass : IClass : où E: EntityObject, puis plus tard, avez votre code. L'erreur du compilateur est "Les contraintes ne sont pas autorisées sur les déclarations non génériques" –

+0

C'est une très bonne réponse. TYVM –

+0

@Dr. Zim: Je suppose que vous avez réglé votre première erreur maintenant? (Fondamentalement, vous avez un colon supplémentaire). –

1

E doit prendre en charge la nouvelle définition() comme par contrainte générique (c.-à-E doit être « : nouvelle() »)

2

Vous avez besoin d'une contrainte E:

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

De cette façon, vous assurez-vous que E a un constructeur sans paramètre.

Vive Matthias

0

Si E ne pas constructeur vide, vous pouvez passer à votre délégué méthode que vous pouvez utiliser pour créer E. Dans ce cas, l'appelant de la méthode serait responsable de la transmission délégué approprié.

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