我有一个用户类。
我创建了一个适用于IEnumerable的任何类型的通用CSV导出器。它检查类并导出其所有属性。
在类User中我不希望导出某些属性(如密码等)。
我知道有一种某种映射器允许创建一个临时类并从原始类中定义属性......我似乎无法找到任何问题。
问候!
答案 0 :(得分:5)
如果您想将IEnumerable<User>
(我们称之为userList
)投影到仅包含部分属性的新IEnumerable
:
var query = userList.Select(u => new { u.Name, u.Address, u.Phone });
现在query
将是IEnumerable<'a>
(匿名类型),其中只包含Name
中的Address
,Phone
和User
属性对象。
答案 1 :(得分:2)
其他回答者提出的解决方案是一种可能的解决方案,但这是另一种解决方案。您可以声明自定义属性:
class CsvIgnoreAttribute : Attribute { }
然后使用此属性标记您不想要的字段:
class User {
public string UserName; // no attribute
[CsvIgnore]
public string Password; // will be ignored
}
然后扩展您的CSV导出器,以便它识别此属性并忽略标有属性的字段:
if (field.GetCustomAttributes(typeof(CsvIgnoreAttribute), true).Any())
continue;
答案 2 :(得分:1)
我相信你在C#中寻找anonymous types
var userToSerialize = new { Name = user.Name, AddressLine1 = user.AddressLine1 }; // and so on...
csvExporter.Export(userToSerialize);
答案 3 :(得分:1)
您也可以在C#中定义匿名('temp')类型,但是不能将它们返回或传递给其他方法而不将它们转换为object
。
可能值得一看AutoMapper,这是一个很棒的库,用于将一种对象类型的属性映射到另一种对象类型:
Mapper.CreateMap<User, UserInfo>();
var dataToExport = Mapper.Map<IEnumerable<User>, IEnumereable<UserInfo>>(userList);
答案 4 :(得分:0)
如果您拥有User
课程,并且只想导出部分内容,则可以定义UserExport
课程
public class UserExport
{
string LastName { get; set; }
string FirstName { get; set; }
}
然后使用AutoMapper之类的内容从User
映射到UserExport
:
Mapper.CreateMap<User, UserExport>();
然后用它来映射属性
UserExport export = Mapper.Map<User, UserExport>(user);
现在您有一个UserExport
课程,您可以将其写入CSV。 AutoMapper将处理从一个类到另一个类的映射属性的所有复杂问题。
我很清楚你也可以像许多其他人建议的那样使用匿名类型来做这件事,并且它可以正常工作。在相同的情况下,您可能会发现拥有实际类型更有用 - 您可以将该类型作为参数类型和更多内容传递给过程。