1

更新 对不起。我并不是说整个反射库都是禁区。我只是说非常慢的 *.Invoke() 东西。

你好,

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

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

并通过字符串访问

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

然而,

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

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

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

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

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

谢谢

4

5 回答 5

2

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

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

于 2009-08-19T03:06:56.153 回答
1

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

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

于 2009-08-19T03:07:06.543 回答
1

我认为很难找到一个不使用DynamicMethod.

正如我评论LorenVS的答案,您可以通过Expression TreesDynamicMethod间接使用。

我已经使用表达式树实现了一个简单的委托生成器。它在 code.google.com 上,所以你可能想看看:LateBoundMethodFactory.cs。它仍然缺少适当的文档,但那里的代码有很好的注释(比我通常做的要多得多)。

更新:链接已更新

于 2009-08-19T04:25:09.017 回答
0

刚刚在搜索 DynamicMethod 时发现了这个。

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

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

于 2009-08-19T04:14:09.523 回答
0

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

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

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

于 2009-08-19T06:21:39.670 回答