C#财产系统

更新抱歉。 我并不是说整个reflection库都是不受限制的。 我只是意味着疯狂的* .Invoke()东西。

嗨,

我需要在C#中实现一个允许正常属性访问的属性系统

[property_attribute()] return_type Property { get; set; } 

并通过字符串访问

 SetProperty(string name, object value); object GetProperty(string name); 

然而,

  1. 我不想单独注册每个属性。
  2. 我不想用reflection
  3. 我不想通过字典访问属性(即没有PropertyTable["abc"]=val;

这种方案是集群计算方案所必需的,我必须远程和本地设置属性。 所有属性都将具有将在初始化时读取的自定义属性。 我希望获得持续的运行时性能。

目前,我的想法是让自定义解析器/ preprocesser在运行时解析/编译脚本并生成set / get代码,如下所示:

 object GetProperty(string name) { if(name = "blah") return Property1; ... } ... 

但是,我将无法使用此方案调试代码。 谁能想到解决方案?

谢谢

您最好的选择是使用System.Reflection.Emit在运行时生成动态方法。 你会获得很好的性能,一旦你正常工作,调试应该不是问题。 (你应该能够依赖它工作,我不明白为什么不工作)。

我更喜欢动态方法方法,因为它不依赖于编译时的代码生成或属性标记或任何类似的东西。 您可以使用它来处理任何对象,它将适用于该对象的所有公共gettable / settable属性。

您可以尝试PostSharp来创建这些属性,并让类实现getter / setter接口。 从技术上讲,它使用reflection,但它在编译时创建程序集,因此它不是典型的System.Relfection方式。

如果您的主要关注点是远程进行,您仍需要设置某种Web服务或WCF服务,在这种情况下您将拥有代理,此代理可以依次使用提到的框架来设置属性。 无论如何,Web服务本质上都使用reflection,因此无法绕过它。

我认为很难找到一个不使用DynamicMethod的好解决方案。

当我评论LorenVS的答案时,您可以通过表达式树间接使用DynamicMethod

我已经使用表达式树实现了一个简单的委托生成器。 它位于code.google.com上,因此您可能需要查看它: LateBoundMethodFactory.cs 。 它仍然缺少适当的文档,但是那里的代码得到了很好的评论(比我通常做的要多得多)。

更新 :链接已更新

刚刚在搜索DynamicMethod时找到了这个。

http://msmvps.com/blogs/jon_skeet/archive/2008/08/09/making-reflection-fly-and-exploring-delegates.aspx

事实certificate,您可以从PropertyInfo创建一个getter / setter委托,并具有接近本机的get / set性能。

如果您不想单独注册earch属性,可以采用以下方法..

protected void SetPropertyValue&ltV> string propertyName,V value){ViewState [propertyName] = value; }

protected V GetPropertyValue&ltV&gt(string propertyName,V nullValue){//这里nullValue可以是string.Empty或true || false或0等…. //如果ViewState [propertyName]为null,则返回我们想要返回的默认值…. if(ViewState [propertyName] == null){return nullValue; } return(V)ViewState [propertyName]; }