Validierung des Aufrufers zur Kompilierungszeit oder ist es möglich, den C#-Compiler zu erweitern?C#

Ein Treffpunkt für C#-Programmierer
Anonymous
 Validierung des Aufrufers zur Kompilierungszeit oder ist es möglich, den C#-Compiler zu erweitern?

Post by Anonymous »

Bedenken Sie diese Methode und die Beschreibung:

Code: Select all

[Description("It must be called from a property, else it is a runtime error.")]
protected T Load()
{
return InternalLoad();
}
Das Design dieser Methode erfordert, dass der Aufrufer eine Eigenschaft sein muss, andernfalls wird InternalLoad ausgelöst eine Ausnahme. Es verwendet StackFrame, um den Namen des Aufrufers abzurufen. Wenn dieser nicht die Form get_
oder set_ hat, wird eine Ausnahme ausgelöst. Es passiert alles zur Laufzeit, was mir nicht gefällt.

Ich möchte wissen, ob es eine Möglichkeit gibt, dies zur Kompilierungszeit sicherzustellen dass der Aufrufer immer eine Eigenschaft ist. Mit anderen Worten, nur Eigenschaften sollten diese Methode aufrufen dürfen. Gibt es eine Möglichkeit, dies zur Kompilierungszeit zu überprüfen?

Als letzten Ausweg ist es möglich, den C#-Compiler zu erweitern, der verwendet werden würde ein benutzerdefiniertes Attribut (z. B. CallableFromAttribute), um das sicherzustellen?

Ich möchte es so flexibel wie möglich machen:

Code: Select all

[CallableFrom(Caller.Property)] //Caller is an enum
protected T Load()
{
return InternalLoad();
}

[CallableFrom(Caller.Property | Caller.Method)]
protected T SomeOtherLoad()
{
//code
}
und dann

Code: Select all

public string Method()
{
var x = this.SomeOtherLoad(); //okay
var y = this.Load();          //compilation error !!
}
Lassen Sie mich wissen, wenn es Unklarheiten gibt. Ich werde es klären. :-)



Ich benötige diese Funktion, weil ich versuche, eine Klasse namens PropertyManager zu implementieren dient als Basis-Klasse für andere Klassen, die Eigenschaften definieren müssen. Die typische Verwendung dieser Klasse wäre folgende:

Code: Select all

public sealed Vendor : PropertyManager
{
public string VendorName
{
get { return this.Load(); }
set { this.Store(value); }
}
public DateTime Created
{
get { return this.Load(); }
set { this.Store(value); }
}
}
Here Load- und Store-Methoden, die in der Basisklasse definiert sind, ermitteln den Namen der Eigenschaft, von der sie stammen werden aufgerufen; Wenn dieser Name als Schlüssel behandelt wird, liest es den zugehörigen Wert aus einem Wörterbuch (im Fall von Load) oder schreibt darauf (im Fall von Store). Es werden Eigentumsänderungen und veränderte Ereignisse ausgelöst. Es unterstützt auch das Rückgängigmachen, da ProperyMananger problemlos alle an einer Eigenschaft vorgenommenen Änderungen verfolgen kann.

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post