다음 유형의 POCO가 있습니다.
public class Person{
public Guid Id { get; set; }
public string Name { get; set; }
public string Address { get; set; }
public int PinCode { get; set; }
public string Phone { get; set; }
}
Person
TSV (탭으로 구분 된 값)로 변환하려는 목록이 있습니다. 그러나 TSV를 만드는 동안 특정 속성 만 고려하기를 원합니다. 이 경우 Id
, Name
및 Phone
.
TSV로 변환하는 데 사용하는 코드는 다음과 같습니다.
public string Serialize(string separator, IEnumerable<Person> objectlist)
{
string[] fields = new[] { "Id", "Name", "Phone" };
StringBuilder tsvdata = new StringBuilder();
string header = string.Join(separator, fields);
tsvdata.AppendLine(header);
foreach (var o in objectlist)
tsvdata.AppendLine(o.Id + separator + o.Person + separator + o.Phone);
return tsvdata.ToString();
}
향후 변경 될 수 있으므로 고려할 필드를 정적으로 언급 / 하드 코딩하고 싶지 않습니다. 어떻게하면 되나요?
TSV를 만드는 데 외부 라이브러리를 사용하지 않더라도 속성 을 사용 하여 특수 속성 (예 : 제외 된 속성) 을 표시 할 수 있습니다 . 그런 다음 리플렉션 을 사용 하여 기존 속성과 속성을 확인할 수 있습니다 .
다음은 완전한 예입니다.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Runtime.Serialization;
using System.Text;
namespace ConsoleApplication1
{
public class Person
{
[DataMember]
public Guid Id { get; set; }
[DataMember]
public string Name { get; set; }
[IgnoreDataMember]
public string Address { get; set; }
[IgnoreDataMember]
public int PinCode { get; set; }
[DataMember]
public string Phone { get; set; }
}
class Program
{
// list of properties of Person class marked with DataMemeber attribute
private PropertyInfo[] _personProperties = typeof(Person)
.GetProperties()
.Where(x => x.GetCustomAttribute(typeof(DataMemberAttribute)) != null).ToArray();
public string Serialize(string separator, IEnumerable<Person> objectlist)
{
StringBuilder tsvdata = new StringBuilder();
string header = string.Join(separator, _personProperties.Select(x => x.Name).ToArray());
tsvdata.AppendLine(header);
foreach (var o in objectlist)
{
List<string> lineValues = new List<string>();
// enumerate through the properties
foreach (var pi in _personProperties)
{
lineValues.Add(pi.GetValue(o).ToString());
}
tsvdata.AppendLine(string.Join(separator, lineValues.ToArray()));
}
return tsvdata.ToString();
}
static void Main(string[] args)
{
Program p = new Program();
List<Person> persons = new List<Person> {
new Person { Id = Guid.NewGuid(), Address = "a1", Name = "name1", Phone = "tel1", PinCode = 1111 },
new Person { Id = Guid.NewGuid(), Address = "a2", Name = "name2", Phone = "tel2", PinCode = 2222 },
};
string serializedString = p.Serialize(", ", persons);
Console.WriteLine($"result: {serializedString}");
}
}
}
이 코드는 POCO 클래스의 모든 속성을 열거하고, 특정 속성이 있는지 확인하고, 해당 속성을 제외하고 나머지를 출력합니다.
원하는대로 고유 한 특성을 정의 할 수 있습니다. 여기서 방금 System.Runtime.Serialization의 IgnoreDataMember 를 사용했습니다 (비슷한 목적으로 사용됨).
기존 속성과 속성을 확인하는 것은 리플렉션을 사용하는 것이므로주의해서 사용해야합니다. 성능이 문제가 될 수 있습니다. 코드가 큰 데이터 세트로 여러 번 실행되면 속도가 느려질 수 있습니다. 그래서 personProperties를 루프에서 개인 멤버 (한 번 계산)로 옮깁니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다