我有两个简单的问题,基于我正在扩展现有的类......
1)我正在实现一些自定义属性,我希望每当它们的值改变时调用一个特定的(无参数)函数。当然,如果不需要调用该函数,我可以使用传统的{ get; set; }
语法,而不需要额外的变量。但是,即使我在set
访问器中修改的唯一内容是对其他函数的调用,我必须声明一个私有变量,以便我可以指定get
和set
访问器我自己......如果没有声明这么多变量,是不是有更简单的方法呢?是不是像 gerenal “属性更改”事件?
2)由于我重写了.NET用户控件,因此我想更改某些基本属性出现的类别。目前,只是要使用[Category("")]
语法,我必须将这些属性声明为new
,并实现get
和set
引用base classe的属性。有没有一种简单的方法可以做到这一点?
答案 0 :(得分:1)
也许您应该查看INotifyPropertyChanged界面。下面是一些使用它的示例代码。我使用此接口在WPF中完成数据绑定。您可以处理该事件,发现已更改的属性并采取相应措施。如果你想让setter异步,你甚至可以在另一个线程(PropertyChanged.BeginInvoke())上引发事件......
using System;
using System.ComponentModel;
public class Foo : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
private void RaisePropertyChanged(string propertyName)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
private string _name;
public string Name
{
get
{
return _name;
}
set
{
_name = value;
RaisePropertyChanged("Name");
}
}
}
答案 1 :(得分:1)
C#本身并不支持这种方式,但您可以通过Interceptors in Windsor进行AOP,这将在运行时提供一个命中,或者使用PostSharp之类的东西为事件调用生成代码。 PostSharp将在创建程序集后注入IL代码,因此在运行时它不应该像Windsor一样大。“
最好再多阅读AOP。
答案 2 :(得分:0)
如果您尝试从没有大量重复编码的访问属性中捕获事件,同时保持关注点的分离,那么您可以使用Castle等框架来研究面向方面编程技术,但要注意这是一个复杂的主题,包括对应用程序架构的艰难选择。
答案 3 :(得分:0)
1)没有财产变更事件。如果你坚持不创建额外的变量you could go the AOP route。没有AOP你应该感到满意,除非你正在处理无数的属性,在这种情况下你可以选择代码生成(可能编写python / ruby脚本来生成代码或使用公共代码生成器)
2)我不认为你可以在没有代码生成的情况下在运行前(在Visual Studio中)更改属性。
答案 4 :(得分:0)
也许我不在这里,但对于#1这样的事情呢?
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace EraseMe2
{
class Program
{
static void Main(string[] args)
{
Test t = new Test();
t.MyProperty = 100;
t.MyProperty = 500;
}
}
class Test
{
public int set(ref int prop, int val)
{
prop = val;
Console.WriteLine(String.Format("{0} changed to {1}", prop.GetType().Name, val.ToString()));
return val;
}
private int _myProperty;
public int MyProperty
{
get { return _myProperty; }
set
{
_myProperty = set(ref _myProperty, value);
}
}
}
}