我正在使用Silverlight 4和VS 2010并尝试对匿名类型进行反思,我得到了一些“尝试按方法'......'来访问方法'......'失败了。”我为此尝试了各种解决方法,但我找不到简单的解决方法。
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);
}
}
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);
}
}
答案 0 :(得分:8)
<强> [编辑] 实际上,您可以通过在项目中应用[assembly:InternalsVisibleTo(“System.Windows”)]程序集级别属性来绑定到匿名类型。这将使Silverlight的数据绑定系统能够查看那些编译器生成的内部类型。
不幸的是,您无法访问匿名对象属性,因为编译器将它们标记为内部属性,而Silverlight安全沙箱会阻止您访问内部成员。
您当前可以执行的操作是调用匿名对象ToString()
方法并从字符串表示中提取值。
希望这有帮助。
答案 1 :(得分:1)
我发现了一篇非常好的文章解决了我的问题。 “这篇文章解释了为什么在评估从不同程序集的公共方法返回的匿名类型的实例时,C#4.0的动态特性似乎不起作用。”并感谢ligaz一个很好的起点。