개체 초기화 및 "명명 된 생성자 관용구"
-
05-07-2019 - |
문제
확인. 그래서 나는 값 목록이 있고 다음과 같은 일을하고 싶습니다.
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 };
}
}