2009-05-21 7 views
1

Mon premier essai d'utiliser des types anonymes (test):type anonyme en tant que paramètre de méthode

private void button4_Click(object sender, EventArgs e) 
    { 
     test(new { a = "asd" }); 
    } 

    private void test(string a) 
    { 
    } 

Je reçois une erreur "ne peut pas convertir 'AnonymousType # 1' à 'string'"

Aussi je « aimerais savoir comment passer d'un type anonyme si le paramètre est une chaîne []

private void test(string[] a) 
    { 
    } 

Merci à l'avance!

Répondre

4

a est une propriété de chaîne sur votre type anonyme

private void button4_Click(object sender, EventArgs e) 
{ 
    test((new { a = "asd" }).a); 
} 

private void test(string a) 
{ 
} 

Edition: Les types anonymes ne dérivent pas de quoi que ce soit autre que l'objet de sorte que vous ne pouvez pas créer une méthode qui attend un paramètre de type anonyme.

Édition 2: lorsque vous créez un type anonyme, le compilateur crée un type entièrement nouveau basé sur les propriétés que vous avez définies et l'ordre dans lequel elles apparaissent. Vous ne pouvez pas créer un type anonyme et l'utiliser à la place de tout autre type (autre que l'objet). Le scénario le plus courant dans lequel je les ai utilisés est celui de la liaison lorsque vous devez aplatir votre graphique d'objets.

avertissement, je suis horrible à venir avec de bons exemples de scénarios et tout cela est de la mémoire! par exemple si j'avais une liste d'objets personne qui avaient une propriété de nom et une propriété d'adresse contenant l'adresse de la rue et nécessaires pour se lier à une zone de liste

var people = new List<Person>() 
listbox.TextMember = "Text"; 
listbox.ValueMember = "Value" 
listbox.DataSource = from p in people 
select new { Text = p.Name, Value = p.Address.StreetAddress }; 
+0

@Venr, Ceci ne fonctionnera pas avec un tableau de chaînes []. –

+0

@ Venr, merci pour la mise à jour! Vous semblez être le seul à toujours voir cette question.J'ai compris à partir des réponses ci-dessus que le paramètre dans le "test" de vide devrait être object.So j'ai un paramètre - object.Je veux passer un tableau string [] en utilisant un type anonyme, comment? –

+0

@ John, si vous avez une méthode qui prend un tableau de chaînes comme paramètre, transmettez-lui un tableau de chaînes. Vous ne créez pas un type anonyme pour cela, généralement vous créez un type anonyme car vous souhaitez un conteneur de propriétés personnalisées. mais juste pour des raisons d'argument, définissez votre type anonyme pour inclure une propriété string [] ou construisez une nouvelle chaîne [] avec la propriété string de votre type anonyme et passez-la à la méthode. – Venr

2

Il n'existe aucun moyen propre de passer un type anonyme entre les méthodes; Vous n'êtes pas censé le faire. Créez un type réel à la place. Si vous voulez vraiment faire cela, vous pouvez utiliser une méthode d'assistance pour truquer maladroitement en créant un autre "modèle" de ce type à lancer à plus tard; voir this et de nombreux articles similaires. En examinant de plus près, vous ne semblez pas comprendre ce qu'est un type anonyme, alors je vous suggère de prendre les autres réponses.

+0

En fait, je voudrais prendre votre réponse, montrez-moi comment cela devrait ressembler à un type anonyme. –

+0

John, vérifiez le lien dans le message de mquander. –

+0

D'accord, j'ai compris que le paramètre devrait être objet, mais comment puis-je obtenir la chaîne [] hors de l'objet? –

5

Quelque chose à propos de votre conception est défectueux. Si votre fonction de test n'accepte que des chaînes, vous ne pouvez jamais lui transmettre un type anonyme, tout comme vous ne pouvez pas passer un int, un objet ou tout autre type de chaîne.

-1

Cela est mauvais, mais ça fonctionne ...

namespace AnonType 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      var foo = new { a = "123", b = "abc" }; 

      Anon(foo); 
      Console.ReadLine(); 
     } 

     public static void Anon(object o) 
     { 
      Console.WriteLine(o); 
     } 
    } 
} 
0

Juste sommes tombés sur cette question et pas à jour pensé que quelqu'un ici doit mentionner la possibilité d'utiliser dynamic à partir de 4,0 C# qui est parfait pour travailler avec des types anonymes. C'est à dire. le code pourrait ressembler à ceci:

private void button4_Click(object sender, EventArgs e) 
{ 
    test(new { a = "asd" }); 
} 

private void test(dynamic obj) 
{ 
    Console.WriteLine(obj.a); 
} 
Questions connexes