C#财产系统

时间:2009-08-19 03:01:54

标签: c# design-patterns properties hpc

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

您好,

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

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

并按字符串访问

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

然而,

  1. 我不想单独注册每个属性。
  2. 我不想使用反射
  3. 我不想通过字典访问属性(即没有PropertyTable["abc"]=val;
  4. 这种方案是集群计算方案所必需的,我必须远程和本地设置属性。所有属性都将具有将在初始化时读取的自定义属性。我希望能够获得持续的运行时性能。

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

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

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

    由于

5 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:1)

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

如果您的主要关注点是远程进行,您仍需要设置某种Web服务或WCF服务,在这种情况下您将拥有代理,此代理可以依次使用提到的框架来设置属性。无论如何,Web服务固有地使用反射,因此没有办法解决它。

答案 2 :(得分:1)

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

当我对 LorenVS 的回答发表评论时,您可以通过Expression Trees间接使用DynamicMethod

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

更新:链接已更新

答案 3 :(得分:0)

在搜索DynamicMethod时找到了这个。

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

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

答案 4 :(得分:0)

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

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

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