C# 使用属性更新作为参数传递的对象
我在C#method属性方面做了一些工作,但还没有做一些涵盖这一需求的工作,我甚至不确定这是否可行,但现在开始 比如说我有一门课,像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
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的开头将其限制为一个函数调用