使用属性更新作为参数传递的对象

时间:2011-09-13 15:55:05

标签: c# .net attributes

我已经对C#方法属性做了一些工作,但是我还没有完成一些涵盖这个要求的东西,我甚至不确定它是否可行但是这里有。

假设我有一个类似的课程。

public class MyObject
{
   public DateTime? TheTime {get;set;}
   public string AValue {get;set;}
}

这样的功能......

public void AddObject(MyObject mo)
{
   //Do Something
}

现在,当传递对象时,将设置AValue,但TheTime将为null(因为这需要在AddObject方法中设置)。我可以这样做...

public void AddObject(MyObject mo)
{
   mo.TheTime = DateTime.Now;
   //Do Something
}

但我不喜欢这样,我想要的是创建一个能为我完成工作的属性。所以最终,我想要这样的东西

[AutoUpdate(Parameter = "mo")]
public void AddObject(MyObject mo)
{
   //Do Something
}

并为我做了魔术。

有关如何创建属性的任何想法吗?一个简单的链接可以做,我似乎无法找到我想要的东西

1 个答案:

答案 0 :(得分:1)

您可以使用横切关注库(AOP)实现此目的,该库在您的方法周围应用decorator pattern,允许您通过属性注入功能。它通常用于记录等事情。

查看Spring.NetCastle Windsor

创建自己的实现的装饰模式的快速示例。

public class MyExtendedClass : IMyClass
{
    public MyExtendedClass(IMyClass myClass)
    {
        this.innerMyClass= myClass;
    }

    public void AddObject(MyObject mo)
    {
       // does mo have an attribute on AddObject
       // if so
       Type clsType = innerMyClass.GetType();
       MethodInfo mInfo = clsType.GetMethod("AddObject");
       if (Attribute.IsDefined(mInfo, typeof(AutoUpdateAttribute)))
       {
          mo.TheTime = DateTime.Now;
       }
       innerMyClass.AddObject(mo);
    } 
}

然后像这样使用:

IMyClass myClass = new MyExtendedClass(new MyClass());
myClass.AddObject(mo);