使用属性生成自定义资源库
本文关键字:自定义 资源库 属性 | 更新日期: 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()
在所有二传手中,所以不确定我实际上会使用它......