使用属性生成自定义资源库

本文关键字:自定义 资源库 属性 | 更新日期: 2024-11-06 03:32:11

在我使用对象数据库持久化实例的类中,我必须不断执行以下操作:

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

而我宁愿输入这个:

[PersistedProperty(Name)]
private string _name;

其中 PersistedProperty 属性生成一个 Getter 和 Setter,就像默认的 [Property()] 属性一样,除了我想向生成的 Setter 添加一行代码。

有没有办法创建一个属性来做到这一点?希望 ,它适用于智能感知。

默认的 [Property()] 属性是如何做到的?如果我看到代码,我可以嫁接它...

注意:我实际上是在 Boo 中这样做的,但我想我会给出 c# 代码,因为更多的人可能愿意回答这个问题,但是,如果有特定于 Boo 的解决方案,我会全力以赴!

更新:

我的目标只是减少打字和混乱。事实证明,最简单的方法是使用一个脚本,该脚本根据我的类中的标记生成分部类。

从标记自动生成源代码(与分部类一起)很容易,实际上看起来是一种非常有前途的方法,可以解决我们通常试图用继承和泛型类型解决的一些问题。

使用属性生成自定义资源库

这需要面向方面的编程。 虽然在 .NET 中不直接支持,但它可以通过第三方工具(如 PostSharp)来完成。

然而,要使智能感知工作,这必须在库中完成,因为(最终)编译的代码将被展开到完整的属性getter/setter中。

使用属性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()在所有二传手中,所以不确定我实际上会使用它......