Comment puis-je créer des objets temporaires de passer autour, sans explicitement la création d'une classe?
Il m'arrive fréquemment d'avoir un besoin de créer une classe comme un conteneur pour certaines données. C'est seulement utilisée brièvement encore, je dois encore créer la classe. Comme ceci:
public class TempObject
{
public string LoggedInUsername { get; set; }
public CustomObject SomeCustomObject { get; set; }
public DateTime LastLoggedIn { get; set; }
}
public void DoSomething()
{
TempObject temp = new TempObject
{
LoggedInUsername = "test",
SomeCustomObject = //blah blah blah,
LastLoggedIn = DateTime.Now
};
DoSomethingElse(temp);
}
public void DoSomethingElse(TempObject temp)
{
//etc...
}
Habituellement mes objets temporaires ont beaucoup plus de propriétés, qui est la raison pour laquelle je tiens à les regrouper en premier lieu. Je souhaite qu'il y avait un moyen plus facile, comme avec un type anonyme. Le problème est, je ne sais pas ce qu'il faut accepter quand je le passe à une autre méthode. Le type est anonyme, alors, comment suis-je censé accepter de l'autre côté?
public void DoSomething()
{
var temp = new
{
LoggedInUsername = "test",
SomeCustomObject = //blah blah,
LastLoggedIn = DateTime.Now
};
//I have intellisense on the temp object as long as I'm in the scope of this method.
DoSomethingElse(temp);
}
public void DoSomethingElse(????)
{
//Can't get my anonymous type here. And even if I could I doubt I would have intellisense.
}
Est-il une meilleure façon de créer un temporaire de conteneurs pour un tas de types différents, ou ai-je besoin de définir des classes à chaque fois que j'ai besoin d'un objet temporaire pour groupe de choses ensemble?
Merci d'avance.
OriginalL'auteur Chev | 2011-08-10
Vous devez vous connecter pour publier un commentaire.
Tuple peut être la solution que vous cherchez.
KeyValuePair sur la pré .NET 4.0 bien qu'il ne vous permet d'avoir deux "membres".
Je vais avec cette réponse parce que c'est vraiment exactement ce que je demandais. Cependant, je n'ai pas vraiment l'intention de l'utiliser car après mettre en pratique, j'ai décidé qu'il n'était pas très lisible. Créer un objet de transfert est toujours le bien-nommé et très lisible à n'importe qui de l'examen du code. Je peut trouver une utilisation pour Tuple peu de temps, mais la légère surcharge d'une classe rend juste les choses plus faciles à suivre et n'oubliez pas.
Grand answwer, je pense. Dans DoSomethingElse comment puis-je accéder à la personne componenents du Tuple?
data.Item1
,data.Item2
, etc. Pas très lisible, de l'OMI.OriginalL'auteur Jacob
Les règles état que
Personnellement, je voudrais juste mordre la balle sur celui-ci afin de préserver moment de la compilation de l'intégrité.
Il est, jusqu'à ce que vous oubliez l'ordre de votre tuple de paramètres.
Vrai,
var newTuple = new Tuple<int,int,string,DateTime,int,bool>(1,2,"hello",DateTime.Now, 3, true);
est un peu moche.Bien que ma réponse utilise
Tuple
et fonctionne, je recommande également cette réponse étant donné que le code est plus facile à lire et moins sujette à erreur de codage.Droit, mais ce n'est pas vraiment une réponse depuis la création de l'objet réel est ce que je fais déjà.
OriginalL'auteur Neil Moss
Le Tuple est le propre de chemin à faire, mais juste pour vous informer que que le C# ne vous décevra pas même autrement, et pour répondre à la question, c'est comment
DoSomethingElse
pourrait ressembler à:PS: Ne pas -1, je ne vais pas l'utiliser, je ne vous demande pas de l'utiliser 🙂
Ford - Comme je l'ai dit, juste dire qu'il y a un moyen!
OriginalL'auteur manojlds
Vous pouvez passer autour des types anonymes en déclarant le paramètre dynamique sous C# 4. Cela dit, je ne recommanderais pas ceci à l'exception de méthodes privées. Vous perdez de sécurité du type, IntelliSense, et la lisibilité.
Vous pouvez également utiliser la non-conteneur générique des classes ArrayList. Mais alors, vous êtes de retour à la coulée, qui est pourquoi nous avons les génériques en premier lieu.
Personnellement j'avais créer la classe. Regardez pour voir si il y a une couche d'abstraction qui couvre tous vos types et de déclarer que comme une interface, puis d'utiliser un conteneur générique de ce type.
temp.NonExistentProperty
et n'obtiendrait pas une erreur du compilateur. C'est absolument horrible.Je suis d'accord, c'est pourquoi je ne le recommande pas pour cet usage. Mais le sens de tuple.Item1 n'est pas évident pour un lecteur, de sorte que a également des inconvénients.
Je suis d'accord. Tuple semblait parfait au début, mais je commence à changer d'avis pour des raisons de lisibilité du saké.
si vous souhaitez que le compilateur pour être en mesure de vérifier les types alors, comment vous attendez-vous à le faire que si vous ne fournissez pas une classe?
Dites-moi, pourquoi pensez-vous que j'ai posté cette question? Est-il Un) je connaissais déjà la réponse, ou B) je ne connaissais pas la réponse. Vous disposez de 30 secondes.....aller. ---joue danger thème de la chanson---
OriginalL'auteur TrueWill
Vous pourriez inclure la Liste de Chaîne de caractères et un constructeur de Liste de Chaîne ...
Je n'ai juste pas trouver la nécessité de jeter les classes. Si l'entreprise objet de la structure, alors la classe est la façon de définir et d'appliquer cette structure et il n'est pas beaucoup de code.
La question est de passer autour des objets temporaires.
OriginalL'auteur paparazzo