2009-08-19 108 views
1

更新 对不起。我并不是说整个反思库都没有限制。我的意思是疯狂缓慢* .Invoke()的东西。C#属性系统

嗨,

我需要实现在C#中的产权制度,允许通过串

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

但是正常属性访问

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

和访问,

  1. 我不想单独注册每个房产。
  2. 我不想使用反射
  3. 我不想通过词典来访问属性(即没有0​​)

该方案需要一个集群计算方案,其中我必须远程和本地设置属性。所有的属性都会有一个自定义属性,这个属性会在初始化时被读取。我希望获得持续的运行时间性能。

目前,我的想法是有一个自定义的解析器/预处理程序解析/运行时编译脚本并生成设置/获取代码如下:

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

不过,我将无法进行调试这个方案的代码。任何人都可以想出解决方案吗?

感谢

+3

如果您消除所有选项,则不需要。 – 2009-08-19 03:03:26

+0

有许多选项,他没有消除,其中大部分涉及某种类型的代码生成。 – LorenVS 2009-08-19 03:14:35

回答

2

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

我更喜欢动态方法,因为它不依赖于编译时的代码生成或属性标记或任何类型的东西。你可以让它在任何对象上工作,它将适用于该对象的所有公共gettable/settable属性。

+0

有趣的想法。 – jameszhao00 2009-08-19 03:41:36

+0

+1动态方法代似乎是要走的路。如果您害怕使用'System.Reflection.Emit',我建议您使用Expression Trees(http://msdn.microsoft.com/zh-cn/library/bb397951.aspx)。在内部,他们也使用'DynamicMethod'。 – jpbochi 2009-08-19 04:15:44

+0

是的,经过测试你的DynamicMethod想法似乎是最好的。它保持原生性能,同时不需要您创建具有不同类型的所有存根代表(与上面概述的CreateDelegate选项不同) – jameszhao00 2009-08-19 04:49:11

1

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

如果您的主要焦点是远程执行此操作,您仍然需要设置某种Web服务或WCF服务,在这种情况下您将拥有一个代理,此代理又可以使用所提到的框架来设置属性。无论如何,Web服务固有地使用反射,所以没有办法绕过它。

+0

谢谢您的链接。我将使用通过“内部呼叫”集成到单声道运行时的定制MPI解决方案。 – jameszhao00 2009-08-19 03:25:17

1

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

正如我在LorenVS的解答发表了评论,你可以使用DynamicMethod间接通过Expression Trees

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

更新:链接更新

+0

不幸的是,我不认为我可以访问Linq。 – jameszhao00 2009-08-19 04:45:16

0

如果你不想单独登记财产操作搜索,你可以去下面的办法..

保护无效SetPropertyValue & LTV & GT(字符串propertyName的,V值) { ViewState [propertyName] = value; }

保护V GetPropertyValue & LTV & GT(字符串propertyName的,V NullValue属性) { //这里NullValue属性可以是的String.Empty或真||假或0等.... //如果ViewState [propertyName]为空,我们想要返回的默认值.... if(ViewState [propertyName] == null) { return nullValue; } return(V)ViewState [propertyName]; }

+0

我不想通过字典访问属性(即没有PropertyTable [“abc”] = val;) – jameszhao00 2009-08-19 06:27:17