Inhalt einer Klasse für andere bestimmte Klasse read-only machen

  • C#
  • .NET (FX) 4.5–4.8

Es gibt 4 Antworten in diesem Thema. Der letzte Beitrag () ist von petaod.

    Inhalt einer Klasse für andere bestimmte Klasse read-only machen

    Hallo liebe community.

    Derzeit habe ich ein problem.
    Ich arbeite mit RestSharp und einer RestAPI und bekomme als response eine JSON content zurück der direkt geparsed wird:

    C#-Quellcode

    1. IRestResponse<List<ProfileInfo>> response = await restAPIClient.ExecuteTaskAsync<List<ProfileInfo>>(request, cancellationTokenSource.Token);


    Dannach möchte ich von außen so zugreifen können

    C#-Quellcode

    1. irgendwas.profiles[0];

    Daher habe ich folgendes getan:

    C#-Quellcode

    1. if(response.StatusCode == HttpStatusCode.OK)
    2. {
    3. _profiles = response.Data;
    4. }


    und ganz oben:

    C#-Quellcode

    1. List<ProfileInfo> _profiles = null;
    2. public List<ProfileInfo> profiles { get { return _profiles; } }


    nun habe ich folgendes problem:
    Wenn ich von außen darauf zugreife also bsp.

    C#-Quellcode

    1. irgendwas.profiles[0];
    dann hab ich bei den child-strings immernoch die option diese zu setzen.
    zb

    C#-Quellcode

    1. irgendwas.profiles[0].nickname;
    Nickname hat get; set; attribute. Ich möchte aber, dass nur klasse A serializen kann und für klasse B soll nickname read-only sein.

    Ich hoffe ich hab das problem einigermaßen gut geschildert.
    Hier nochmal meine ProfileInfo Klasse:

    C#-Quellcode

    1. public class ProfileInfo
    2. {
    3. public string alias { get; set; }
    4. public List<object> allergies { get; set; }
    5. public DateTime birthday { get; set; }
    6. public bool geneticsEnabled { get; set; }
    7. public int heightInCentimeters { get; set; }
    8. public bool isMainProfile { get; set; }
    9. public string key { get; set; }
    10. public List<object> medications { get; set; }
    11. public RiskFactors riskFactors { get; set; }
    12. public string sex { get; set; }
    13. public bool synchronizeHealthData { get; set; }
    14. public int weightInGrams { get; set; }
    15. }

    Fachkraftx3 schrieb:

    für klasse B soll nickname read-only sein.
    Was ist mit Klasse C?
    Zum Serialisieren muss das ganze public sein, da hast Du keine Chance.
    Probierma so was:

    C#-Quellcode

    1. public string NickName { get { return this._NickName; } }

    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    *unnötiges Zitat entfernt*

    Also Klasse A macht aus dem JSON Response:

    C#-Quellcode

    1. [{"key":"5b182049f16b680001008247","alias":"XXXX","sex":"MALE","allergies":[{"name":"XXXXXX","key":"5b1837d9f16b68000100dd8d"}],"medications":[],"weightInGrams":60000,"heightInCentimeters":183,"riskFactors":{"smoker":"PATHOLOGICAL","hypertension":"NON_PATHOLOGICAL","diabetes":"NON_PATHOLOGICAL"},"birthday":"XXXXXX","synchronizeHealthData":false,"isMainProfile":true,"geneticsEnabled":false},{"key":"5b282a2ef9dcce00019c4015","alias":"XXXXX","sex":"FEMALE","allergies":[],"medications":[],"riskFactors":{"smoker":"PATHOLOGICAL","pregnancy":"SKIPPED","hypertension":"NA","diabetes":"SKIPPED"},"birthday":"XXXXXXX","synchronizeHealthData":false,"isMainProfile":false,"geneticsEnabled":false}]


    mithilfe von:

    C#-Quellcode

    1. public class ProfileInfo
    2. {
    3. public string alias { get; set; }
    4. public List<object> allergies { get; set; }
    5. public DateTime birthday { get; set; }
    6. public bool geneticsEnabled { get; set; }
    7. public int heightInCentimeters { get; set; }
    8. public bool isMainProfile { get; set; }
    9. public string key { get; set; }
    10. public List<object> medications { get; set; }
    11. public RiskFactors riskFactors { get; set; }
    12. public string sex { get; set; }
    13. public bool synchronizeHealthData { get; set; }
    14. public int weightInGrams { get; set; }
    15. }



    folgendes für Klasse B:

    C#-Quellcode

    1. irgendwas.profiles[0];

    nur Klasse B soll alias unter profiles[0] nur aufrufen aber nicht setzen können.
    und das zerbricht mir den kopf

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Marcus Gräfe“ ()

    vlt. verstehe ich nicht richtig, aber imo kann das nicht gehen.

    Entweder ein Property-Setter ist Public, oder er ist es nicht.
    Er kann nicht für einen Aufrufer Public sein, und für einen anderen Private.

    Mit Interfaces könnte man was kompliziertes basteln, aber umständlich, und wer den Code sieht, wird erstmal fragen: "Hä??"

    Und mit Json + Serialisierung hat das garnix zu tun, aber deshalb glaube ich ja auch, dass ich das Thema nicht richtig verstanden habe.
    Auf Anhieb fällt mir nur ein, dem Konstruktor einen Parameter mitzugeben, der die Property steuert.
    Betrachtet es als Pseudo-Code.
    Es ist in VB geschrieben, aber aus dem Kopf und völlig ungetestet.
    Das Prinzip sollte daraus hervorgehen.
    Müsste man halt noch nach C# konvertieren.
    Wenn es überhaupt das ist, was gewünscht ist.

    Visual Basic-Quellcode

    1. Public Class ProfileInfo
    2. Dim Parent As Object, _NickName As String
    3. Sub New(Parent As Object)
    4. Me.Parent = Parent
    5. End Sub
    6. Property NickName As String
    7. Get
    8. Return _NickName
    9. End Get
    10. Set (value As String)
    11. If Parent IsNot B Then _NickName = Value
    12. End Set
    13. End Class
    14. Class A
    15. Dim pi As New ProfileInfo(Me)
    16. End Class
    17. Class A
    18. Dim pi As New ProfileInfo(Me)
    19. End Class
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --