2010-09-03 107 views
1

我在VS 2010中使用Silverlight 4并尝试在匿名类型上做反射,并且我得到了一些“尝试按方法'...'来访问方法'...'失败“。我尝试了各种解决方法,但我找不到和简单的。反射失败的属性在Silverlight中的匿名类型

class.CallAnonymous("SimpleClass", "HelloFunc", new { strIn = "Boo" });

public void CallAnonymous(string cName, string cAction, object anonymousParms) 
    { 
     Type anonymousType = anonymousParms.GetType(); 

     PropertyInfo[] props = anonymousType.GetProperties(); 
     ServiceParam serviceParam = new ServiceParam(); 

     foreach (var info in props) 
     { 
      string propertyName = info.Name; 
      object propertyObj = info.GetValue(anonymousParms, null); 
      // Throw the exception on PropertyInfo.GetValue() 

      serviceParam.Add(propertyName, propertyObj); 
     } 
    } 

回答

8

[编辑] 实际上,你可以通过使用绑定到一个匿名类型[装配:InternalsVisibleTo( “System.Windows”)装配水平在你的项目属性。这将使Silverlight的数据绑定系统能够查看那些编译器生成的内部类型。

不幸的是,你不能访问匿名对象属性,因为编译器将它们标记为内部,并且Silverlight安全沙箱会阻止你访问内部成员。

您目前可以做的是调用匿名对象ToString()方法并从字符串表示中提取值。

希望这会有所帮助。

1

我发现一篇很好的文章解决了我的问题。 “这篇文章解释了为什么C#4.0的动态特性在评估从不同程序集的公共方法返回的匿名类型实例时似乎不起作用。”并感谢ligaz的一个很好的起点。

Anonymous Types are Internal, C# 4.0 & Silverlight

相关问题