7

オブジェクトデータベースを使用してインスタンスを永続化するクラスでは、次のことを実行する必要があります。

private string _name;
public string Name
    {
    get { return this._name; }
    set { _name = value; this.Save(); }
    }

一方、私はむしろこれを入力したいと思います:

[PersistedProperty(Name)]
private string _name;

ここで、PersistedProperty属性は、デフォルトの[Property()]属性と同じようにゲッターとセッターを生成しますが、生成されたセッターにコード行を追加する必要があります。

これを行う属性を作成する方法はありますか?うまくいけば、これはIntellisenseで動作します。

デフォルトの[Property()]属性はどのように機能しますか?コードを見たら、それを移植することができます...

注:私は実際にBooでこれを行っていますが、もっと多くの人がそれに答えてくれるかもしれないので、c#コードを与えると思いましたが、Boo固有の解決策があれば、私はすべての耳です!

アップデート:

私の目的は、単にタイピングと混乱を減らすことでした。これを行う最も簡単な方法は、クラスのマークアップに基づいて部分的なクラスを生成するスクリプトを使用することでした。

マークアップから(部分クラスと並行して)ソースコードを自動生成するのは簡単で、実際には、継承や汎用型で通常解決しようとする問題のいくつかを回避するための非常に有望な方法のように見えます。

4

2 に答える 2

1

これにはアスペクト指向プログラミングが必要です。.NETでは直接サポートされていませんが、PostSharpなどのサードパーティツールを介して実行できます。

ただし、インテリセンスが機能するには、(最終的な)コンパイル済みコードが完全なプロパティゲッター/セッターに展開されるため、これはライブラリで実行する必要があります。

于 2012-08-08T16:27:28.523 に答える
1

属性IMOを使用して実装するのは簡単ではありません。たぶん、拡張メソッドなどの別のアプローチを使用できます。

// Extension method that allows updating a property
// and calling .Save() in a single line of code.
public static class ISaveableExtensions
{
    public static void UpdateAndSave<T>(
        this ISaveable instance,
        Expression<Func<T>> propertyExpression, T newValue)
    {
        // Gets the property name
        string propertyName = ((MemberExpression)propertyExpression.Body).Member.Name;

        // Updates its value
        PropertyInfo prop = instance.GetType().GetProperty(propertyName);
        prop.SetValue(instance, newValue, null);

        // Now call Save
        instance.Save();
    }
}
...
// Some interface that implements the Save method
public interface ISaveable
{
    void Save();
}
...
// Test class
public class Foo : ISaveable
{
    public string Property { get; set; }

    public void Save()
    {
        // Some stuff here
        Console.WriteLine("Saving");
    }

    public override string ToString()
    {
        return this.Property;
    }
}
...
public class Program
{
    private static void Main(string[] args)
    {
        Foo d = new Foo();

        // Updates the property with a new value, and automatically call Save
        d.UpdateAndSave(() => d.Property, "newValue");

        Console.WriteLine(d);
        Console.ReadKey();
    }
}

タイプセーフでオートコンプリートに適していますが、単なる。よりも多くのコードが必要です。Save()すべてのセッターで、実際に使用するかどうかはわかりません...

于 2012-08-08T16:48:33.167 に答える