63 votes

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

C'est un long plan, mais j'ai une situation de codage drôle où je veux pouvoir créer des classes anonymes à la volée, mais pouvoir les passer 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?

63voto

Jon Skeet Points 692016

Pas de. Les types anonymes toujours implicitement dérivent object, et de ne jamais mettre en œuvre toutes les interfaces.

À partir de la section 7.6.10.6 du C# 5 specificiation:

Un objet anonyme initialiseur déclare un type anonyme et retourne une instance de ce type. Un type anonyme est un nom du type de classe qui hérite directement de object.

Donc, si vous souhaitez une autre classe de base ou vous souhaitez implémenter une interface, vous avez besoin d'un type nommé.

8voto

Shlomi Borovitz Points 1409

Non. D'après la documentation :

Les types anonymes sont des types de classe qui dérivent directement de l'objet et qui ne peuvent pas être convertis en n'importe quel type, sauf l'objet.

Pour résoudre votre problème, remplacez simplement le type anonyme par une classe normale ...

2voto

T McKeown Points 7312

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.

1voto

HighCore Points 23088

Ça n'a aucun sens.

Comment la méthode pourrait-elle accéder aux propriétés créées de manière anonyme pour cet objet? Cette méthode verrait un MyBase et rien d'autre, à moins que vous ne le convertissiez (à quoi ??)

Je pense que c'est une approche étrange. Fais juste

 new MyBase
{
   Property1 = t.SomeValue1,
   Property2 = t.SomeValue2,
   //..etc
}
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X