내 상황은 이렇습니다. 여러 다른 유형의 객체에 대해 유효성 검사 및 마사지 유형 코드를 실행해야하지만 청결 (코드 재사용)을 위해이 유효성 검사에 대한 호출을 모두 객체에 관계없이 동일하게 만들고 싶습니다. 오버로드를 통해 이것을 해결하려고 시도하고 있는데, 이는 Generic Collection 객체를 얻을 때까지 제대로 작동합니다.일반 콜렉션을 처리 할 수있는 유형이 아닌 특정 메소드를 찾으려면 #
다음의 예는 내가 여기에 무슨 말인지 명확하게해야한다 : 나는 모든 다른 컬렉션 <T> 유형에 대한 정확한 동일한 코드를 복제 할 필요가로
private string DoStuff(string tmp) { ... } private ObjectA DoStuff(ObjectA tmp) { ... } private ObjectB DoStuff(ObjectB tmp) { ... } ... private Collection<ObjectA> DoStuff(Collection<ObjectA> tmp) { foreach (ObjectA obj in tmp) if (DoStuff(obj) == null) tmp.Remove(obj); if (tmp.Count == 0) return null; return tmp; } private Collection<ObjectB> DoStuff(Collection<ObjectB> tmp) { foreach (ObjectB obj in tmp) if (DoStuff(obj) == null) tmp.Remove(obj); if (tmp.Count == 0) return null; return tmp; } ...
이 진짜 쓰레기처럼 보인다. 각각 별도의 컬렉션을 만들지 않고 Collection <T>을 처리하는 DoStuff의 단일 인스턴스를 만들고 싶습니다.
ICollection을 사용해 보았지만 두 가지 문제점이 있습니다. 첫째, ICollection은 .Remove 메서드를 노출하지 않으며 목록의 개체 유형을 모르기 때문에 foreach 루프를 작성할 수 없습니다. . Object와 같은 좀 더 일반적인 것을 사용하는 것은 Object를 받아들이는 DoStuff 메소드가 없기 때문에 작동하지 않습니다. 실제 객체에 적합한 메소드를 호출해야합니다. DoStuff 메서드를 작성하는 DoStuff 메서드를 작성하고 if 메서드의 거대한 목록을 작성하여 올바른 메서드를 선택하고 적절하게 캐스팅하면 중복 된 코드를 없애라는 전체 아이디어를 무시합니다. 모든 컬렉션을 복사하여 붙여 넣을 수도 있습니다. <T> 방법.
나는 일반적인 DoStuff <T> 방법을 사용하여 시도했지만,이 두 가지 단점이 있습니다 - 첫째, 그것은 각각의 호출을을 그들은, 그들이 가지고있는 (그들은 더 이상 DoStuff (ㅋ ㅋ를 호출 할 수 있습니다)를 호출하는 일반적인 어떤 방법을 선언해야 DoStuff를 호출하려면 < 문자열 > (blah)). 둘째, foreach 루프에서 동일한 문제점이 있습니다. 디자인 타임에 객체 유형을 모르기 때문에 컴파일러에서 DoStuff (obj)를 호출 할 수 없습니다.
기술적으로 컴파일러는 컴파일 타임에 어떤 호출을해야 하는지를 알 수 있어야합니다. 왜냐하면 이것들은 모두 private 메소드이고 호출에서 전달되는 특정 유형의 객체는 모두 메소드의 시점에서 알려지기 때문입니다 호출되고 있습니다. 그 지식은이 메소드에 의해 호출되는 나중의 메소드에 버블 링되지 않는 것처럼 보입니다.
여기 리플렉션을 사용하고 싶지 않습니다. 모든 콜렉션 <T> 메서드를 복사하여 붙여 넣는 것보다 코드가 훨씬 복잡해지며 성능이 저하됩니다. 어떤 아이디어?
--- EDIT 1 --- 꺾쇠 괄호에 html 코드를 사용하지 않았기 때문에 제네릭 메소드 참조가 올바르게 표시되지 않는다는 것을 알았습니다. 이것은 지금 고쳐 져야합니다.
--- 편집 2 --- 아래의 응답을 바탕으로, 내가 변경 한 다음과 같이 내 컬렉션 <T> 방법 :
이private Collection DoStuff(Collection tmp) { for (int i = tmp.Count - 1; i >= 0; i--) if (DoStuff(tmp[i]) == null) tmp.RemoveAt(i); if (tmp.Count == 0) return null; return tmp; }
이 여전히으로하지만, 작동하지 않습니다 컴파일러는 DoStuff (tmp [i])를 호출 할 때 호출 할 오버로드 된 메서드를 파악할 수 없습니다. 이 같은
만들기'Collection''컬렉션'나는 당신이 대답 : –
@MikeMcCaughan이다 컬렉션 일반적인 여부를 확인할 수 있습니다 생각하십니까? 그러나 그것이 사실이라 할지라도, 제가 한 마지막 예에서 볼 수 있듯이, 그것이 유형이라는 것을 알 수있는 어떤 이유도 보이지 않습니다. DoStuff는 매우 일반적 일 수 있습니다. – LightStriker
음 ... 좋은 지적입니다. 컴파일러는'tmp [i]'타입을 알아야하고 올바른 오버로드로 전달할 수 있습니다. –