2009-10-29 4 views
0

선거 결과를 저장할 클래스를 만듭니다. 내가 파일을 구문 분석하고 파일에서 결과와 결과 클래스를 반환합니다 정적 메서드가 결과 클래스가 있습니다.내부적으로 수정할 수있는 읽기 전용 속성 노출

내부 수정 자 (Precinct.InternalCandidates)를 사용하고 있기 때문에 정적 메서드 만 결과를 수정할 수 있습니다. (이 메서드는 dll 밖에있는 클래스의 인스턴스가 메서드에 액세스하는 것을 방지합니다. ?).

어쨌든, 후보 클래스를 인스턴스화 된 버전의 클래스에 읽기 전용 목록으로 노출해야하지만 채우기 프로세스 중에 후보를 추가 할 수 있어야합니다. 여기

Results r = Results.ParseResultsFile("PathToFile.txt"); 
r.Candidates.Add(new Candidate) // Should error here 
Console.WriteLine(r.Candidates[0].Name) // Should work 

I가있는 무엇 : 그래서,

여기

내가 구상 것 어떻게 작동하는 것 InternalCandidates의 읽기 전용 버전을 공개 Precinct.Candidates는 선거구 클래스의 다른 매개 변수라고 만들었습니다 내 수업 스텁 :

public class Results { 
    private List<Precinct> precincts = new List<Precinct>(); 
    public ReadOnlyCollection<Precinct> Precincts { 
     get { return this.precincts.AsReadOnly(); } 
    } 

    public Results() {} 

    public static Results ParseResultsFile(string filePath) { ... } 
} 

public class Precinct { 
    internal List<Contest> InternalContests { get; set; } 
    public ReadOnlyCollection<Contest> Contests { 
    get { return this.InternalContests.AsReadOnly(); } 
    } 
    public Precinct { 
    this.InternalContests = new List<Contest>(); 
    } 
} 

더 좋은 방법이 있나요?

답변

0

다시. 내 오래된 질문을 정리 ... 내 자신의 컬렉션을 굴러 결국.

놀랍게도 해결했습니다 ..

2

나쁜 소식이 있습니다. Rob ... Reflection을 사용하면 액세스 수정자를 완전히 피할 수 있습니다. 이들은 팀을 스스로 보호하지만 보안을 제공하는 데는 적합하지 않습니다.

코드의 물리적 보안을 보장하고 아무도 자신의 제작 응용 프로그램 도메인에 DLL을로드 할 수 없도록해야합니다.

업데이트 :

나는 스스로 고쳐 쓴다. 호출자가 전적으로 신뢰하지 않는 한 반사를 방지하는 속성을 설정할 수 있습니다 (Leppie에서 업데이트). See how.

전신 신뢰가없는 발신자가 개인/내부 방법 및 필드에 액세스하지 못하게 할 수는 있지만 전체 신뢰 발신자는 리플렉션 사용을 막을 수 없습니다.

+0

FullTrust가 모든 것을 무시하므로 그 속성은 도움이되지 않습니다. – leppie

+1

또한 해당 특성은 * 호출 프로그램 *에 적용되어야하며 * 호출 수신자 * 어셈블리에는 적용되지 않아야합니다. 그래서 Rob은 자신의 공격자가 정중 한 태도로 자신의 성찰을 거부 할 수있는 경우에만 자신을 보호 할 수 있습니다 ** 웃음 **. 그리고 그가 .NET 4로 이동할 때 그 속성은 무시 될 것입니다. – itowlson

+0

좋아요 ... 나는 그것을하는 악의적 인 사람에 대해 정말로 걱정하지 않습니다. 실제로 데이터를 엉망으로 만들고 싶다면 텍스트 파일 만 변경하면됩니다. 이것은 나의 팀 (당신이 읽었습니다 : 저)이 우연히 Precinct.Candidates.Add()와 같이 어리석은 일을하지 않도록하는 것입니다. 동일한 것을 가리키는 내부 및 공개 속성을 모두 갖고있는 것이 최선의 방법 일지 궁금합니다. InternalContests를 가질 필요는 없지만 Contests.Add는 내부 용으로 만 만들면됩니다. 어쩌면 List <>를 사용하지 않고 내 자신을 파생시킬 필요가 있을까요? – Rob