2012-03-28 90 views
0

我正在寻找一种方法来在运行时更改/添加给定类的属性的访问器。 示例代码波纹管,在类的.ctor上运行,我想要达到的是将'TheSetMethod'添加到'设置'每个'字段'的访问器,以便通过在运行时更改字段。 供参考:这背后有一个实现约束,这使得我这样做,而不是使用标准的“get; set;”祖先,所以我不能'得到;设定';'在设计时间。如何在运行时更改属性访问器

public string field1; 

    .ctor() 
    { 
     Type typeWebConfig = this.GetType(); 
     MemberInfo[] Fields = typeWebConfig.GetMembers(BindingFlags.Public | 
           BindingFlags.Instance); 
     foreach(MemberInfo member in Fields) 
      if(member.MemberType == MemberTypes.Field) 
      { 
       FieldInfo field = (FieldInfo)member; 
       //add a delegate method to field's 'SET' 
      } 
    } 

    void TheSetMethod(string propName) 
    { 
    } 

任何帮助将不胜感激。 干杯

+3

您是否将C#与动态语言混淆? – 2012-03-28 23:52:15

+1

所以如果一个类使用另一个类,并且突然使用的类改变了它的访问器,第一个类如何处理它? – 2012-03-28 23:52:50

+0

感谢您的意见,但我真的很感激,如果你真的帮助:) – Afshin 2012-03-29 00:07:43

回答

0

您可以实现自定义DynamicObject类型来手动处理访问器。这只会在.NET 4+中起作用。

+0

谢谢M.Babcok,唯一阻止我使用DynamicObject的东西(虽然它确实有帮助),但我们对设计时间并不了解,这非常重要。除非我没有得到你的意思? – Afshin 2012-03-29 00:10:41

+1

你是对的,这将失去intellisense,因为你的实例需要通过'dynamic'访问。虽然我似乎记得有一个VS扩展可以使intellisense工作(我不记得哪一个不幸)。 – 2012-03-29 00:22:26

-1

为什么不只是将代码添加到setter开始,然后使用变量来确定代码是否应该执行?在我看来,这听起来像是一个糟糕的设计,因为制作setter的“Dynamic”似乎也不能很好地进行测试。

+0

简单的答案是“设计约束”。 – Afshin 2012-03-29 05:12:40

相关问题