更新 抱歉。我并不是说整个反射库是不受限制的。我只是意味着疯狂的* .Invoke()东西。
您好,
我需要在C#中实现一个允许正常属性访问的属性系统
[property_attribute()]
return_type Property { get; set; }
并按字符串访问
SetProperty(string name, object value);
object GetProperty(string name);
然而,
PropertyTable["abc"]=val;
) 这种方案是集群计算方案所必需的,我必须远程和本地设置属性。所有属性都将具有将在初始化时读取的自定义属性。我希望能够获得持续的运行时性能。
目前,我的想法是让自定义解析器/ preprocesser在运行时解析/编译脚本并生成set / get代码,如下所示:
object GetProperty(string name)
{
if(name = "blah")
return Property1;
...
}
...
但是,我无法使用此方案调试代码。谁能想到解决方案?
由于
答案 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时找到了这个。
事实证明,您可以从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]; }