문제

확인. 그래서 나는 값 목록이 있고 다음과 같은 일을하고 싶습니다.

MyObjectValues
.Select(currentItems=>new MyType()
{
     Parameter1 = currentItems.Value1,
     Parameter2 = currentItems.Value2
});

여기 문제가 있습니다. 다음과 같은 이름의 생성자와 함께 작업하려면 위의 예가 필요합니다.

MyObjectValues
.Select(currentItems=>MyType.GetNewInstance()
{
     Parameter1 = currentItems.Value1,
     Parameter2 = currentItems.Value2
});

내가 할 수있는 방법이 있습니까? 기본적으로 객체 인스턴스를 다시 가져 오려면 호출 해야하는 정적 메소드가 있으며 위와 같이 초기화하고 싶습니다.

편집 : 현재 MyType의 인터페이스를 쉽게 수정하는 방법이 없으므로 현재 새로운 기능 호출을 추가하는 것은 현재 실용적이지 않습니다.

도움이 되었습니까?

해결책

불행히도 C# 3.0에서는 이에 대한 직접적인 지원이 없습니다. 객체 초기화기입니다 생성자 호출을 위해 지원됩니다. 그러나 빌더 패턴을 고려할 수 있습니다. 내 프로토콜 버퍼 포트에서는 다음과 같이 지원합니다.

MyType foo = new MyType.Builder {Parameter1 = 10, Parameter2 = 20}.Build();

그래서 당신의 예는 다음과 같습니다.

MyObjectValues.Select(currentItems => new MyType.Builder
{
     Parameter1 = currentItems.Value1,
     Parameter2 = currentItems.Value2
}.Build());

물론 그것은 중첩 된 빌더 유형을 작성하는 것을 의미하지만 잘 작동 할 수 있습니다. MyType가 신경 쓰지 않는다면 엄밀히 말하자면 변동성, 당신은 불변 API를 남길 수 있지만 인스턴스를 만듭니다. Builder 즉시 새 인스턴스를 만듭니다 MyType, 그런 다음 (개인 회원에게 액세스 할 때) 속성을 설정 한 다음 마지막으로 인스턴스를 반환합니다. MyType 에서 Build() 방법. (그러면 추가 돌연변이가 금지되도록 인스턴스를 "잊어야한다".

다른 팁

나는 누군가가 4.0 c#에서 그것을 할 수있는 영리한 방법을 생각할 것이라고 확신하지만, 나는 그냥 읽었다. C# 4.0의 명명 된 매개 변수에 대한 Sam Ng의 블로그 게시물. 이것은 당신의 문제를 해결해야합니다. 다음과 같습니다.

MyObjectValues.Select(currentItems=>MyType.GetNewInstance(
    Parameter1:currentItems.Value1,
    Parameter2:currentItems.Value2));

편집하다

Fogot은 언급 할 수 있습니다.이 유용한 것은 매개 변수의 기본값을 설정할 수 있으므로 모든 것을 전달할 필요가 없다는 것입니다. 블로그 게시물은 좋은 짧은 요약입니다.

업데이트: 공장은 어떻습니까 :

MyObjectValues.Select(currentItems=>MyTypeFactory.GetNewInstance(currentItems.Value1,
currentItems.Value2));


public static class MyTypeFactory
{
    public static MyType GetNewInstance(
         typeofvalue1 value1, 
         typeofvalue2 value2)
    {
        return new MyType { Parameter1 = value1, Parameter2 = value2 };
    }
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top