0

프로젝트에서 작업 중이므로 CSV 파일에 개체를 serialize/저장합니다. (예, 이것이 최선의 방법은 아니지만 반드시 필요함을 알고 있습니다.)객체 필드에 속성을 동적으로 적용 할 수 있습니까?

솔루션을 깨끗하게 유지하기 위해 솔루션 내부에 여러 프로젝트가 있습니다. 그 중 하나는 라이브러리 프로젝트입니다. 저장소/직렬화 방법을 포함합니다. 이 프로젝트에는 CSV 작업을 수행하는 데 사용하려는 제 3 자 라이브러리 인 CSVhelper에 대한 참조가 있습니다. 프로젝트 프로젝트 B로 진행되는

foo myobject = new foo(x,y,z); 
B.WriteToCsv(myobject); 

에서

(내 lib 디렉토리를 참조 csvhelper는)

public static WriteToCsv(foo myobject); // csvhelper would do the work 

그러나, Csvhelper는 작동 할 수 있습니다 전에 내 foo는 개체에 설정된 특정 속성을 필요로 그 위에.

내가, 내 foo는 개체 클래스 정의 파일에 이러한 특성을 적용하지 않도록 노력하고 대신 내가 프로젝트 B. 내부에 동적으로 이러한 특성을 적용하는 것을 선호

내 질문은, 동적으로, 나중에 속성을 적용하는 것이 가능하다 ? 전체 요점은 가능한 한 내 프로젝트를 깨끗하게 유지하는 것입니다.하지만이 작업을 더욱 복잡하게 만들 것이라고 생각합니다. 이것은 나쁜 생각입니까, 아니면이 문제에 대한 일반적인 해결책이 있습니까? 예와 요청에


업데이트 :

내 foo는 개체 정의 : 유지하기 위해

public class Foo 
{ 
    [CsvColumn(Name = "a", FieldIndex = 1)] 
    public string a; 
    [CsvColumn(Name = "b", FieldIndex = 2)] 
    public string b; 
    [CsvColumn(Name = "c", FieldIndex = 3)] 
    public int c; 
} 

:

public class Foo 
{ 
    public string a; 
    public string b; 
    public int c; 
} 

CsvHelper이 같은 필드의 특성을 필요로 내 코드를 깨끗하게 정리하고, 여기에이 속성들을 추가하는 것을 피하고 싶다. 왜냐하면 모든 코드를 storin과 연관 짓기를 원하기 때문이다. g/내 별도의 라이브러리에서 직렬화. (프로젝트 B)

+2

"특성"이란 속성 또는 .NET 의미의 특성을 의미합니다. '[Serializable]'? 짧지 만 완전한 예제를 제공하면 도움이 될 것입니다. –

+0

@JonSkeet 업데이트되었습니다. 나는 .NET 의미에서 속성을 의미합니다. [XYZ] –

답변

1

예 아니요. 귀하의 경우 - 번호 :

사실상 속성을 동적으로 추가 할 수 있지만 리플렉션에 대한 접근 방법은 매우 다릅니다. http://msdn.microsoft.com/en-us/library/ms171819.aspx
제 3 자 라이브러리가이를 지원하는지 의심 스럽습니다.

유연성이 필요할 때 유형/객체를 일종의 구성과 연결하는 것을 선호합니다.
개체에 값을 연결해야하는 경우 ConditionalWeakTable을 고려하십시오.

하지만 이러한 모든 변형은 불행히도 귀하의 상황에서 사용할 수 없습니다.

우려를 분리해야하는 경우 올바르게 적용된 속성으로 DTO를 만들고 엔티티를 쉽게 변환하기 위해 일종의 매퍼 (예 : Automapper)를 사용하면됩니다.

3

[XYZ]와 같은 속성을 기존의 컴파일 된 코드에 볼트로 고정 할 수 없으며 컴파일시에 존재해야합니다.

클래스 라이브러리가 이러한 작업을 처리하는 일반적인 방법은 메타 데이터가 포함 된 데이터 구조를 사용하는 오버로드와 특성에서 메타 데이터를 추출하는 또 다른 오버로드가있을 수 있다는 것입니다. 이 과부하가이 클래스 라이브러리에 없으면 운이 없어진 것입니다.

은 클래스가 상속을 허용하는 경우 런타임에 하위 클래스를 생성 할 수 있으며,이 경우 적합하다고 판단되는 속성을 추가 할 수 있습니다. 보안 모델 및 기존 클래스에 따라 옵션이 될 수도 있고 그렇지 않을 수도 있습니다.

1

일반적인 패턴은 "도우미"유틸리티가 특성 또는 확인 자 또는 둘 모두의 시스템을 사용하기위한 것입니다. 이것의 좋은 예가 ProtoBuf입니다. 패턴은 다음과 같이 작동합니다.

  1. 호출자는 인터페이스 포인터를 Resolver 메서드에 전달합니다.
  2. 도우미 함수는 Type 처리를 위해 Resolver를 호출합니다.이 처리기는 Type 처리 방법에 대한 특정 정보를 반환 할 수 있습니다.
  3. Resolver 인터페이스가 전달되지 않았거나 Resolver 호출이 유용한 정보를 제공하지 못하면 도우미는 Attributes로 돌아가서 필요한 정보를 제공하는지 확인합니다.

이것은 SOLID 세계와 초기 Attribute 기반 프로그래밍 스타일을 연결하는 매우 깔끔한 시스템입니다.

+0

예를 들어 주셔서 감사합니다! –

관련 문제