我想保持一个’设置’属性的dictonary,并检查’get’动作是否已经设置(并且如果没有则抛出错误).
我正在通过msdn文档查看反思,代表等…,但我不完全确定这是可能的.
有没有办法做到这一点?或者在调用其中一个可以在基类中拦截的函数时触发事件?
解决方法 我为Set编写了一个拦截器,它可以很容易地为Get扩展,它使用RealProxy,这意味着你的基类需要派生出MarshalByRefObject.另一个奇特的选择是让你的类抽象,并使用Reflection Emit构造一个包装所有属性的具体类.
你也可以看看代码生成器来解决这个问题或postsharp …
这个解决方案的性能并不是很好,但对于大多数UI绑定来说它应该足够快.可以通过生成用于代理调用的LCG方法来改进它.
public interface IInterceptorNotifiable { voID OnPropertyChanged(string propertyname);}/// <summary>/// A simple RealProxy based property interceptor/// Will call OnPropertyChanged whenever and property on the child object is changed/// </summary>public class Interceptor<T> where T : MarshalByRefObject,IInterceptorNotifiable,new() { class InterceptorProxy : RealProxy { T proxy; T target; EventHandler<PropertyChangedEventArgs> OnPropertyChanged; public InterceptorProxy(T target) : base(typeof(T)) { this.target = target; } public overrIDe object GettransparentProxy() { proxy = (T)base.GettransparentProxy(); return proxy; } public overrIDe IMessage Invoke(IMessage msg) { IMethodCallMessage call = msg as IMethodCallMessage; if (call != null) { var result = InvokeMethod(call); if (call.Methodname.StartsWith("set_")) { string propname = call.Methodname.Substring(4); target.OnPropertyChanged(propname); } return result; } else { throw new NotSupportedException(); } } IMethodReturnMessage InvokeMethod(IMethodCallMessage callMsg) { return RemotingServices.ExecuteMessage(target,callMsg); } } public static T Create() { var interceptor = new InterceptorProxy(new T()); return (T)interceptor.GettransparentProxy(); } private Interceptor() { }}
用法:
class Foo : MarshalByRefObject,IInterceptorNotifiable { public int PublicProp { get; set; } public string lastPropertyChanged; public voID OnPropertyChanged(string propertyname) { lastPropertyChanged = propertyname; } } [Test] public voID TestPropertyInterception() { var foo = Interceptor<Foo>.Create(); foo.PublicProp = 100; Assert.AreEqual("PublicProp",foo.lastPropertyChanged); }}总结
以上是内存溢出为你收集整理的c# – 有没有办法在设置类的任何属性时调用方法?全部内容,希望文章能够帮你解决c# – 有没有办法在设置类的任何属性时调用方法?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)