Frage

Ich bin mit partiellen Klassen eine Funktionalität zwischen 2 Dateien zu teilen, aber ich bin immer einen Fehler. Was mache ich falsch?

A1.cs:

private partial class A
{
    private string SomeProperty { get { return "SomeGeneratedString"; } }       
}

A2.cs:

private partial class A
{
    void SomeFunction()
    {
        //trying to access this.SomeProperty produces the following compiler error, at least with C# 2.0
        //error CS0117: 'A' does not contain a definition for 'SomeProperty'
    }
}
War es hilfreich?

Lösung

Sind die beiden Teilklassen im gleichen Namensraum? Das könnte eine Erklärung sein.

Andere Tipps

Die gleiche Antwort wie @Andrey K aber in einfachen Worten

Legen Sie die Build-Aktion von allen Teilklassen ‚Compile‘ ‚Eigenschaften‘ Fenster jedes dieser Dateien mit

 Fenster Eigenschaften - loading= Action Eigenschaft ">

andere Namespace?

Zuerst war ich nicht in der Lage Ihre Fehler zu reproduzieren.

Wenn diese Teilklassen definiert sind allein, in einem Namensraum, verursacht das Schlüsselwort private den Build mit zum Scheitern verurteilt „Elemente in einem Namensraum definiert ist, können nicht explizit als privat deklariert werden, geschützt oder geschützte internen“ ...

Wenn ich sie privat halten und nisten sie in eine andere Klasse, alles funktioniert.

kann ich die Fehler reproduzieren nur dann, wenn in einer Datei, ich ein Teil der Klasse in eine andere Klasse verschachtelt, und in einer anderen Datei, kann ich nicht verschachtelt die Klasse, und dann mit dem Schlüsselwort private entfernen ... wie folgt aus:

Class1.cs:

namespace stackoverflow.answers
{
    public class Foo
    {
        private partial class Bar
        {
            private string SomeProperty { get { return "SomeGeneratedString"; } }
        }
    }
}

Class2.cs:

namespace stackoverflow.answers
{
    partial class Bar
    {
        void SomeFunction()
        {
            string bar = this.SomeProperty;
        }
    }    
}

Ich habe auch den Fehler, den Sie beschrieben, wenn die Namensräume unterscheiden.

Bitte senden Sie den gesamten Code für die Lösung, da der bereitgestellten Code ungültig C # Syntax ist, und kann nicht in ohne mehr Kontext betrachtet werden.

Edit:

Lösung: build Aktion -> Complile, nichts anderes

Ich werde versuchen, um genauer zu sein:

Ich hatte eine Klasse unter drei Teilklassen geteilt in 3 verschiedenen Dateien. In einem Moment ein Funktionsaufruf (aus einem Teil, der eine Funktion in einem anderen Teil deklariert) gestartet Fehler zeigt „existiert nicht im aktuellen Kontext“. Es dauerte lange, bis ein Typ half mir , um herauszufinden, dass aus Versehen habe ich die Build-Aktion der Datei mit einem Teil zu "EmbeddedResourse" anstelle von "Übersetzen".

Um Build Aktion zu wechseln, sollten Sie direkt auf Datei klicken in Projektmappen-Explorer, und wählen Sie Eigenschaften. Dann die Aktion Build ändern.

Diese Frage ist alt, und meine Antwort ist in diesem Fall nicht gerade hilfreich. Aber es kann zu partiellen Klassen im Zusammenhang in einem anderen sehr seltenen Fall hilfreich sein. Sorry, wenn mein Englisch ist nicht klar.

Ich denke, es ist, weil Sie Ihre Klasse als „privat“ sind zu deklarieren. Versuchen Sie, den Modifikator Wechsel auf „intern“, so dass die beiden „Hälften“ der Klasse „sehen“ kann sich innerhalb derselben Baugruppe.

Der Fehler ich erhalte, ist:

Elemente in einem Namensraum definiert ist, können nicht explizit als privat deklariert werden, geschützt oder interne geschützt

Ich vermute, es ist ein Namespace-Problem, wie zuvor angegeben.

Alle Dateien im selben Ordner sein sollten.

ich analysieren Ihren Code. Sie erklärten Teilklasse als geschachtelte Klasse dieser Fehler zu zeigen, ist verursachen. warum bcz partielle Klasse wird nicht als geschachtelte Klasse deklariert das Parial Schlüsselwort aufgeteilt in ehrere Dateien so, jede Datei Nae ist gleich, wenn Sie in verschachtelter Klasse deklariert wird es nicht erkennen.

Eine Ecke Fall, dass zusätzliche Hilfe Sie Zeit sparen können, wenn Sie eine partielle Klasse werden mit einem Laufzeit Text ergänzen Vorlage der generierten Klasse.

Die Chancen stehen gut, dass das Problem ist in der Tat, dass Ihr Teil-Klasse-Namespace aus dem Namensraum des erzeugten Teils dieser Klasse unterscheidet. Um das zu überprüfen, schauen Sie einfach auf den generierten Code.

Um das zu beheben, müssen Sie die .csproj Datei für Ihr Projekt bearbeiten, und im Abschnitt über diese Vorlage, fügen Sie den <ClassNamespace> Tag:

<Content Include="MyTemplate.tt">
  <Generator>TextTemplatingFilePreprocessor</Generator>
  <ClassNamespace>My.Namespace</ClassNamespace>
  <LastGenOutput>MyTemplate.cs</LastGenOutput>
</Content>
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top