zu verwenden Die einfache Demo unten erfasst, was ich versuche zu tun. Im realen Programm muss ich den Objektinitialisiererblock verwenden, da er eine Liste in einem LINQ to SQl select -Ausdruck liest, und es gibt einen Wert, den ich von der Datenbank ablesen und auf dem Objekt speichern möchte, aber das Objekt hat keine einfache Eigenschaft, die ich für diesen Wert festlegen kann. Stattdessen hat es einen XML-Datenspeicher.Gibt es eine Möglichkeit, eine Erweiterungs-Methode in einem Objektinitialisiererblock in C#
Es sieht so aus, als ob ich im Objektinitialisiererblock keine Erweiterungsmethode aufrufen kann und dass ich keine Eigenschaft mit Erweiterungsmethoden anhängen kann.
Also habe ich Pech mit diesem Ansatz? Die einzige Alternative scheint zu sein, den Besitzer der Basisklasse zu überreden, ihn für dieses Szenario zu modifizieren.
Ich habe eine bestehende Lösung, wo ich BaseDataObject ableiten, aber das hat auch Probleme, die in diesem einfachen Beispiel nicht angezeigt werden. Die Objekte werden beibehalten und als BaseDataObject wiederhergestellt - die Umwandlungen und Tests werden komplex.
public class BaseDataObject
{
// internal data store
private Dictionary<string, object> attachedData
= new Dictionary<string, object>();
public void SetData(string key, object value)
{
attachedData[key] = value;
}
public object GetData(string key)
{
return attachedData[key];
}
public int SomeValue { get; set; }
public int SomeOtherValue { get; set; }
}
public static class Extensions
{
public static void SetBarValue(this BaseDataObject dataObject,
int barValue)
{
/// Cannot attach a property to BaseDataObject?
dataObject.SetData("bar", barValue);
}
}
public class TestDemo
{
public void CreateTest()
{
// this works
BaseDataObject test1 = new BaseDataObject
{ SomeValue = 3, SomeOtherValue = 4 };
// this does not work - it does not compile
// cannot use extension method in the initialiser block
// cannot make an exension property
BaseDataObject test2 = new BaseDataObject
{ SomeValue = 3, SomeOtherValue = 4, SetBarValue(5) };
}
}
Eine der Antworten (von mattlant) eine Fluent Interface Design Extension-Methode schlägt mit. Beispiel:
// fluent interface style
public static BaseDataObject SetBarValueWithReturn(
this BaseDataObject dataObject, int barValue)
{
dataObject.SetData("bar", barValue);
return dataObject;
}
// this works
BaseDataObject test3 = (new BaseDataObject
{ SomeValue = 3, SomeOtherValue = 4 }).SetBarValueWithReturn(5);
Aber funktioniert das in einer LINQ-Abfrage?
Soll die Set-Methode vom BaseDataObject entfernt werden? Ich würde dringend vorschlagen, einfach Unterklasse mit Get/Set Eigenschaften zu verwenden. – Tigraine