gpt4 book ai didi

c# - 您能否使方法成为属性变量中默认 setter 操作的一部分?

转载 作者:太空狗 更新时间:2023-10-29 20:24:33 27 4
gpt4 key购买 nike

如果您有多个属性在 setter 中实现相同的方法,是否有办法使其成为默认 setter 的一部分?

如果我有多个属性在设置时调用 Filter(),有没有办法将它插入“基本 setter ”,这样我就不必拥有 Filter() 在每个 setter 中调用?

private string _MyVal1;
public string MyVal1 {
get {
return _MyVal1;
}
set {
_MyVal1 = value;
Filter();
OnPropertyChanged("MyVal1");
}
}

private string _MyVal2;
public string MyVal2 {
get {
return _MyVal2;
}
set {
_MyVal2 = value;
Filter();
OnPropertyChanged("MyVal2");
}
}

private string _MyValN;
public string MyValN {
get {
return _MyValN;
}
set {
_MyValN = value;
Filter();
OnPropertyChanged("MyValN");
}
}

于是变成了这样:

private string _MyValN;
public string MyValN {
get {
return _MyValN;
}
set : FilterSetter {
_MyValN = value;
OnPropertyChanged("MyValN");
}
}

最佳答案

执行此操作的另一种方法是使用 Unity 框架提供的拦截。通过拦截,您的类实现了一个接口(interface),并且您会告诉框架,每次在实现该接口(interface)的类上调用方法时,运行这些拦截器。您的拦截器代码可以查看被调用的方法是否以 set_ 为前缀。拦截器代码在前往函数的途中执行一次,在返回途中执行一次。在返回的路上,您可以让拦截器调用 filter 方法(当然假设它是在接口(interface)上定义的)。

具体例子:

获取先决条件库

使用 NuGet 为您的项目添加 Unity 和 Unity 扩展

定义你要拦截的接口(interface):SomeObject.cs

using System;

namespace InterceptSetter
{
interface ISomeObject
{
string SomeProperty { get; set; }
void Filter();
}

public class SomeObject : ISomeObject
{
public string SomeProperty { get; set; }

public void Filter()
{
Console.Out.WriteLine("Filter Called");
}
}
}

定义拦截行为:SetterCallsFilterMethodBehavior.cs

using Microsoft.Practices.Unity.InterceptionExtension;
using System;
using System.Collections.Generic;
using System.Linq;

namespace InterceptSetter
{
/// <summary>
/// See http://msdn.microsoft.com/en-us/library/ff660871(v=pandp.20).aspx
/// See http://msdn.microsoft.com/en-us/library/ff647107.aspx
/// </summary>
class SetterCallsFilterMethodBehavior : IInterceptionBehavior
{
public IEnumerable<Type> GetRequiredInterfaces()
{
// we dont need anything
return new[] { typeof(ISomeObject) };
}

public IMethodReturn Invoke(IMethodInvocation input, GetNextInterceptionBehaviorDelegate getNext)
{ // Do not intercept non-setter methods
if (!input.MethodBase.Name.StartsWith("set_"))
return getNext()(input, getNext);

IMethodReturn msg = getNext()(input, getNext);

// post processing. this is where we call filter
if (input.Target is ISomeObject)
{
(input.Target as ISomeObject).Filter();
}

return msg;
}

/// <summary>
/// We always execute
/// </summary>
public bool WillExecute
{
get { return true; }
}
}
}

编写测试控制台程序:Program.cs

using Microsoft.Practices.Unity;
using Microsoft.Practices.Unity.InterceptionExtension;
using System;

namespace InterceptSetter
{
class Program
{
static void Main(string[] args)
{
UnityContainer container = new UnityContainer();

container.AddNewExtension<Interception>();
container.RegisterType<ISomeObject, SomeObject>(
new Interceptor<TransparentProxyInterceptor>(),
new InterceptionBehavior<SetterCallsFilterMethodBehavior>());

// we must get our instance from unity for interception to occur
ISomeObject myObject = container.Resolve<ISomeObject>();
myObject.SomeProperty = "Hello Setter";

Console.ReadLine();
}
}
}

运行这个你会看到拦截器实际上调用了过滤器方法(打印到控制台)。

Unity 并不是唯一的依赖注入(inject)/拦截框架 (google PostSharp)。 Unity 是我熟悉的,所以这就是这个例子使用的。

来源/另见:

  1. http://msdn.microsoft.com/en-us/library/ff660871(v=pandp.20).aspx - 描述拦截流程的好图
  2. http://msdn.microsoft.com/en-us/library/ff647107.aspx - 显示不同拦截技术的细节矫枉过正

关于c# - 您能否使方法成为属性变量中默认 setter 操作的一部分?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15227409/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com