C'est un long plan, mais j'ai une situation de codage amusante où je veux pouvoir créer des classes anonymes à la volée, mais pouvoir les transmettre en tant que paramètre à une méthode qui attend une interface ou une sous-classe. En d'autres termes, j'aimerais pouvoir faire quelque chose comme ceci:
public class MyBase { ... }
public void Foo(MyBase something)
{
...
}
...
var q = db.SomeTable.Select(t =>
new : MyBase // yeah, I know I can't do this...
{
t.Field1,
t.Field2,
});
foreach (var item in q)
Foo(item);
Y a-t-il un moyen de faire cela autre que d'utiliser une classe nommée?
Non. Les types anonymes dérivent toujours implicitement de object
et n'implémentent jamais d'interfaces.
De la section 7.6.10.6 de la spécification C # 5:
Un initialiseur d'objet anonyme déclare un type anonyme et renvoie une instance de ce type. Un type anonyme est un type de classe sans nom qui hérite directement de
object
.
Donc, si vous voulez une classe de base différente o vous voulez implémenter une interface, vous avez besoin d'un type nommé.
Non. De la documentation :
Les types anonymes sont des types de classe qui dérivent directement de l'objet et qui ne peuvent être transtypés en aucun type sauf l'objet.
Pour résoudre votre problème, remplacez simplement le type anonyme par une classe normale ...
Impossible d'étendre un anonyme mais vous pouvez déclarer votre méthode pour accepter un paramètre dynamique si vous en avez vraiment besoin pour fonctionner.
Réponse courte: non
Réponse longue: vous pouvez utiliser une classe proxy C #. Il existe plusieurs outils qui peuvent proxy des classes. Par exemple, Moqs. https://github.com/moq/moq4