web-dev-qa-db-fra.com

Est-il possible de faire hériter une autre classe anonyme?

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?

51
Shaul Behr

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é.

49
Jon Skeet

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 ...

7
Shlomi Borovitz

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.

2
T McKeown

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

0
Anders