Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用属性更新作为参数传递的对象_C#_.net_Attributes - Fatal编程技术网

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

C# 使用属性更新作为参数传递的对象,c#,.net,attributes,C#,.net,Attributes,我在C#method属性方面做了一些工作,但还没有做一些涵盖这一需求的工作,我甚至不确定这是否可行,但现在开始 比如说我有一门课,像 public class MyObject { public DateTime? TheTime {get;set;} public string AValue {get;set;} } 像这样的函数 public void AddObject(MyObject mo) { //Do Something } 现在,当传递对象时,将设置AVal

我在C#method属性方面做了一些工作,但还没有做一些涵盖这一需求的工作,我甚至不确定这是否可行,但现在开始

比如说我有一门课,像

public class MyObject
{
   public DateTime? TheTime {get;set;}
   public string AValue {get;set;}
}
像这样的函数

public void AddObject(MyObject mo)
{
   //Do Something
}
现在,当传递对象时,将设置AValue,但时间将为null(因为这需要在AddObject方法中设置)。我可以这样做

public void AddObject(MyObject mo)
{
   mo.TheTime = DateTime.Now;
   //Do Something
}
但我不喜欢这样,我想要的是创建一个属性,它将为我完成这项工作。所以最终,我想要这样的东西

[AutoUpdate(Parameter = "mo")]
public void AddObject(MyObject mo)
{
   //Do Something
}
魔法已经为我完成了


关于如何创建属性来实现这一点,有什么想法吗?一个简单的链接就可以了,我现在似乎找不到我要找的东西

您可以通过一个横切关注点库()来实现这一点,它在您的方法周围应用了一个新的链接,允许您通过属性注入功能。它通常用于记录日志之类的事情

看看或者

一个装饰器模式的快速示例,用于创建您自己的实现

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);

您可以通过一个横切关注点库()来实现这一点,该库在您的方法周围应用了一个框架,允许您通过属性注入功能。它通常用于记录日志之类的事情

看看或者

一个装饰器模式的快速示例,用于创建您自己的实现

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);

谢谢你的链接,我会看一看,但我不想为此使用任何第三方应用程序。我想自己创建这个属性创建这个属性很好,但是需要一些引擎来调用它。你可以自己用一个装饰师来做这件事,如果你使用的是一个IoC容器,那就更容易了。好的,我想我明白你的意思了。我以前使用过MVC ActionFilterAttributes,我想这些设置是为了完成您所说的“额外工作”,因为它们有一些可以重写的有用方法。我们实际上是在用PostSharp做一些其他的东西,我想这可以满足我的需要。我希望能够创造我自己,所以我想我会尝试一下,看看我的表现如何。谢谢你的信息谢谢你的链接,我会看一看,但我不想使用任何第三方应用程序。我想自己创建这个属性创建这个属性很好,但是需要一些引擎来调用它。你可以自己用一个装饰师来做这件事,如果你使用的是一个IoC容器,那就更容易了。好的,我想我明白你的意思了。我以前使用过MVC ActionFilterAttributes,我想这些设置是为了完成您所说的“额外工作”,因为它们有一些可以重写的有用方法。我们实际上是在用PostSharp做一些其他的东西,我想这可以满足我的需要。我希望能够创造我自己,所以我想我会尝试一下,看看我的表现如何。感谢您提供的信息,我不确定我是否理解您为什么需要复杂的属性解决方案。有什么原因不能让AValue的setter在设置日期时间字段时更新该字段,或者沿着这些行进行更新?或者确实在对象的构造函数中执行一些操作。如果没有
mo.TheTime=DateTime,我甚至不知道你的属性会如何工作。现在
某个地方有一行代码,或者这是一个从许多方法中重构出来的例子?@Chris,没有重构可以做。设置AValue的层不应该与时间有关。关心它是AddObject函数的任务。还有一些其他标准属性也需要关注。这不能在构造时完成,因为这又不是函数调用代码的工作。有多个公共属性需要以这种方式更新。我想现在我将添加一个帮助函数来进行更新(就像我的属性代码一样),然后我至少可以在AddObjective开始时将其限制为一个函数调用。我不确定我是否理解为什么需要复杂的属性解决方案。有什么原因不能让AValue的setter在设置日期时间字段时更新该字段,或者沿着这些行进行更新?或者确实在对象的构造函数中执行一些操作。如果没有
mo.TheTime=DateTime,我甚至不知道你的属性会如何工作。现在
某个地方有一行代码,或者这是一个从许多方法中重构出来的例子?@Chris,没有重构可以做。设置AValue的层不应该与时间有关。关心它是AddObject函数的任务。还有一些其他标准属性也需要关注。这不能在构造时完成,因为这又不是函数调用代码的工作。有多个公共属性需要以这种方式更新。我想现在我将添加一个进行更新的helper函数(就像我的属性代码一样),然后我至少可以在AddObject的开头将其限制为一个函数调用