2010-10-06 121 views
0

我想这样做来获得本地路径的值如下:使用反射来得到一个属性的属性

Dim bar As WebProxy = WebProxy.GetDefaultProxy 
    Dim scriptEngine = bar.GetType().GetProperty("ScriptEngine", Reflection.BindingFlags.NonPublic Or Reflection.BindingFlags.Instance) 
    Dim acs As PropertyInfo = scriptEngine.PropertyType().GetProperty("AutomaticConfigurationScript", Reflection.BindingFlags.NonPublic Or Reflection.BindingFlags.Instance) 
    Dim localPath As PropertyInfo = acs.PropertyType().GetProperty("LocalPath", Reflection.BindingFlags.Public Or Reflection.BindingFlags.Instance) 
    Dim value As String = localPath.GetValue(acs, Nothing).ToString 

我敢肯定的是,这里的问题是,我传递一个PropertyInfo对象变成了localPath .GetValue,而不是实际的对象本身。唯一的问题是,我不能投的

Dim acs As PropertyInfo = scriptEngine.PropertyType().GetProperty("AutomaticConfigurationScript", Reflection.BindingFlags.NonPublic Or Reflection.BindingFlags.Instance) 

结果成的System.Uri AutomaticConfigurationScript并把它传递,因此我得到一个错误“对象不匹配目标类型”。

任何想法?

P.S我意识到这不是一个C#的问题,但不想限制可能的答案,我已经标记它,因为它是一个.NET的问题,如果我收到答案在C#我可以翻译。

回答

1

你需要得到在每一步实际的对象,并用它来获得一个属性:

Dim bar As WebProxy = WebProxy.GetDefaultProxy 

Dim scriptEngineProperty = bar.GetType().GetProperty("ScriptEngine", Reflection.BindingFlags.NonPublic Or Reflection.BindingFlags.Instance) 
Dim scriptEngineObject as Object = scriptEngineProperty.GetValue(bar, Nothing) 

Dim acsProperty As PropertyInfo = scriptEngineObject.GetType().GetProperty("AutomaticConfigurationScript", Reflection.BindingFlags.NonPublic Or Reflection.BindingFlags.Instance) 
Dim acsObject as Object = acsProperty.GetValue(scriptEngineObject, Nothing) 

Dim localPathProperty As PropertyInfo = acsObject.GetType().GetProperty("LocalPath", Reflection.BindingFlags.Public Or Reflection.BindingFlags.Instance) 
Dim value As String = localPath.GetValue(acsObject, Nothing).ToString 
+0

辉煌,感谢里德。我应该知道,但我现在有点时间限制恐慌:) – Ben 2010-10-06 15:00:40

+0

@本:很高兴它有帮助;) – 2010-10-06 15:05:54