2010-07-31 4 views
2

J'ai un utilisateur de classe.Mapper une classe à une classe temporaire (sans certaines propriétés)

J'ai créé un exportateur CSV générique qui fonctionne sur n'importe quel type IEnumerable. Il vérifie la classe et exporte toutes ses propriétés.

Dans la classe Utilisateur, je ne souhaite pas que certaines propriétés soient exportées (mot de passe, etc.).

Je sais qu'il y a un mappeur quelconque qui permet de créer une classe temp et de définir les propriétés de la classe d'origine ... je n'arrive pas à trouver un exaple.

ce qui concerne!

Répondre

5

Si vous voulez projeter un IEnumerable<User> (appelons-le userList) à une nouvelle IEnumerable avec seulement quelques-unes des propriétés:

var query = userList.Select(u => new { u.Name, u.Address, u.Phone }); 

Maintenant query sera un IEnumerable<'a> (type anonyme) qui contient seulement les Name, Address et Phone es à partir de vos objets User.

+0

oui c'est ce que je cherchais. Merci à tous pour vos réponses! – no9

1

Je crois que vous cherchez anonymous types en C#

var userToSerialize = new { Name = user.Name, AddressLine1 = user.AddressLine1 }; // and so on... 
csvExporter.Export(userToSerialize); 
2

La solution proposée par les autres répondeurs est une solution possible, mais en voici une autre. Vous pouvez déclarer un attribut personnalisé:

class CsvIgnoreAttribute : Attribute { } 

Ensuite, marquez les champs que vous ne souhaitez pas en utilisant cet attribut:

class User { 
    public string UserName; // no attribute 

    [CsvIgnore] 
    public string Password; // will be ignored 
} 

étendre ensuite votre exportateur CSV afin qu'il reconnaisse cet attribut et ignore les champs marqués avec l'attribut:

if (field.GetCustomAttributes(typeof(CsvIgnoreAttribute), true).Any()) 
    continue; 
1

vous pouvez également définir anonyme (« temp ») types en C#, mais vous ne pouvez pas retourner ceux-ci ou de les transmettre à d'autres méthodes sans les jeter à object.

Il pourrait être intéressant de regarder AutoMapper, qui est une grande bibliothèque pour les propriétés de cartographie dans un type d'objet à un autre:

Mapper.CreateMap<User, UserInfo>(); 
var dataToExport = Mapper.Map<IEnumerable<User>, IEnumereable<UserInfo>>(userList); 
0

Si vous avez votre classe User, et que vous voulez exporter uniquement certaines parties , vous pouvez définir une UserExport classe

public class UserExport 
{ 
    string LastName { get; set; } 
    string FirstName { get; set; } 
} 

puis utiliser quelque chose comme AutoMapper à la carte de User à UserExport:

Mapper.CreateMap<User, UserExport>(); 

puis l'utiliser pour cartographier les propriétés

UserExport export = Mapper.Map<User, UserExport>(user); 

Maintenant, vous avez une classe UserExport que vous pouvez écrire à votre CSV. AutoMapper traitera toutes les complexités des propriétés de mappage d'une classe à l'autre.Je suis bien conscient que vous pouvez également le faire avec des types anonymes comme beaucoup d'autres l'ont suggéré, et ça marchera très bien. Dans les mêmes cas, vous pourriez trouver plus utile d'avoir un type réel, bien que - vous pouvez passer ce type à une procédure en tant que type de paramètre et quelques autres choses.

Questions connexes