Laden...

Codegeneriung: protected internal Methode überschreiben

Erstellt von Quaneu vor 8 Jahren Letzter Beitrag vor 8 Jahren 1.902 Views
Quaneu Themenstarter:in
692 Beiträge seit 2008
vor 8 Jahren
Codegeneriung: protected internal Methode überschreiben

Hallo zusammen,

ich will per Codegenerierung von einer Klasse ableiten und eine Methode überschreiben.


public class TestClass
{
    protected internal virtual object VirtualMethodA()
    {
        return null;
    }
}

Per Reflection und Codedom bekomme ich folgendes:


//------------------------------------------------------------------------------
// <auto-generated>
//     Dieser Code wurde von einem Tool generiert.
//     Laufzeitversion:4.0.30319.34209
//
//     Änderungen an dieser Datei können falsches Verhalten verursachen und gehen verloren, wenn
//     der Code erneut generiert wird.
// </auto-generated>
//------------------------------------------------------------------------------

namespace TestGen
{
    using System;
    
    
    public sealed class TestClassGen : Test.TestClass
    {
        
        protected internal override object VirtualMethodA()
        {
            throw new System.Exception();
        }
    }
}

Eiegntlich sollte es ja passen, jedoch bekomme ich beim generieren folgende Ausnahme:> Fehlermeldung:

'Test.TestClass.VirtualMethodA()': Die Zugriffsmodifizierer können beim Überschreiben des geerbten 'protected'-Members 'TestGen.TestClass.VirtualMethodA()' nicht geändert werden.

Ich denke es liegt an dem Property Attributes in der CodeMemberMethod. Per Reflection analysiere ich TestClass und bekomme für VirtualMethodA(): IsFamilyOrAssembly == true.
In diesem Fall setze ich


method.Attributes =  MemberAttributes.Override | MemberAttributes.FamilyOrAssembly;

Dies führt zu dem obigen Code. Jedoch weiß ich nicht wieso es nicht ganz klappt. Ohne internal klappt es... Aber ich versteh einfach nicht wieso...

Schöne Grüße
Quanue

D
96 Beiträge seit 2012
vor 8 Jahren

Es ist ganz einfach so, dass du eine protected internal Methode nur mit dem Keyword protected überschreiben kannst.


public class A
{
       protected internal void MyMethod() {}
}


// Andere Assembly

public class B : A
{
     protected internal override MyMethod() {} // Error
     protected override MyMethod() {} // Korrekt
}


Das hat den einfachen Grund, dass "protected internal" die Bedeutung "protected" ODER "internal" hat. Könntest du mit "protected internal" aus einer Assembly B überschreiben, dann wäre die Methode in Assembly B global sichtbar (da Internal), was aber der original deklarierten Methode aus Assembly A widerspricht (nur in Assembly A oder in abgeleiteten Klassen sichtbar).

Quaneu Themenstarter:in
692 Beiträge seit 2008
vor 8 Jahren

Hallo DerKleineTomy,

vielen Dank für Deine Antwort. Ich habe ganz vergessen, dass Codedom immer eine eigene Assembly generiert. Aber jetzt ist alles klar und alles macht wieder einen Sinn. Danke.

Schöne Grüße
Quaneu