나는 여전히 제네릭에 대해 머리를 감싸고 있으며 올바르게 작업하고 싶은 도전에 맞서고 있습니다. 이렇게 정의 된 몇 가지 클래스가있는 경우 :
public abstract class DocBase {
public long ID { get; set; }
public string Description { get; set; }
public long DocumentID { get; set; }
public string DocumentDate { get; set; }
...snipped...
}
public class AppDoc : DocBase {
public string A { get; set; }
public string B { get; set; }
public string C { get; set; }
}
public class OtherDoc : DocBase {
public string D { get; set; }
public string E { get; set; }
public string F { get; set; }
}
이 문서를 검색하는 데 사용할 수업이 있습니다.
public class Repo<T> where T : DocBase, new()
이 클래스에는 메서드가 포함됩니다.
public List<T> GetDocs()
이 메서드에서 파생 클래스 (AppDoc : A, B, C 및 OtherDoc : D, E, F)에 정의 된 속성에 액세스 할 수 있기를 원합니다. 하지만 이렇게 새 객체를 선언하면 :
var doc = new T();
디자인 타임에는 파생 된 클래스 (AppDoc 및 OtherDoc)가 아닌 기본 클래스 (DocBase)에서만 사용할 수있는 속성이 있습니다. 속성 A, B, C, D, E 및 F에 어떻게 가나 요?
편집 : 내 "어떻게 ..."에 대해 조금 자세히 설명합니다. 데이터베이스에서 가져온 결과 목록의 GetDocs () 메서드 내에서 속성 A, B, C, D, E 및 F를 채워야합니다.
public List<T> GetDocs(){
var results = someService.GetMyDocuments();
var documents = new List<T>();
foreach(IRepositoryRow row in results) {
var newDoc = new T();
newDoc.A = row.GetProperty("AFromDatabase").ToString();
newDoc.B = row.GetProperty("BFromDatabase").ToString();
documents.Add(newDoc);
}
return documents;
}
해당 속성으로 무엇을 하려는지에 따라 다릅니다.
그것들을 조작한다면 (예를 들어 그것들을 채우거나 그것들을 기반으로 thigns를 계산하는) DocBase
like 에 대한 추상 메소드 DoStuff
는 당신의 T에서 안전하게 호출 될 수 있고 당신이 속성으로 원하는 것을 할 수 있습니다.
객체가 무엇인지에 따라 다른 일을하고 싶다면 그것은 실제로 매우 일반적이지 않으며 아마도 객체에 대해 호출 할 수있는 추상 또는 가상 메서드를 갖는 것에 대해 약간 재고하고 싶을 것입니다.
질문에 입력 한 내용을 기반으로 한 몇 가지 샘플 코드 :
public abstract class DocBase {
...
public abstract void LoadProperties(IRepositoryRow row);
...
}
public List<T> GetDocs(){
var results = someService.GetMyDocuments();
var documents = new List<T>();
foreach(IRepositoryRow row in results) {
var newDoc = new T();
newDoc.LoadProperties(row);
documents.Add(newDoc);
}
return documents;
}
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다