c# – WP7.1上的匿名类型和获取访问器?

我正在尝试写一个简单的对象到字典转换器,如下所示:
public static class SimplePropertyDictionaryExtensionMethods
{
    public static IDictionary<string,string> ToSimplePropertyDictionary(this object input)
    {
        if (input == null)
            return new Dictionary<string,string>();

        var propertyInfos = from property in input.GetType()
                                .GetProperties(BindingFlags.Instance | BindingFlags.Public | BindingFlags.FlattenHierarchy | BindingFlags.GetProperty)
                            where property.CanRead
                            select property;

        return propertyInfos.ToDictionary(x => x.Name,x => input.GetPropertyValueAsString(x));
    }

    public static string GetPropertyValueAsString(this object input,PropertyInfo propertyInfo)
    {
        var value = propertyInfo.GetGetMethod().Invoke(input,new object[] {});
        if (value == null)
            return string.Empty ;

        return value.ToString();
    }
}

但是,当我尝试这样称呼:

var test = (new { Foo="12",Bar=15 }).ToSimplePropertyDictionary();

那么它失败了一个例外:

[System.MethodAccessException]: {"Attempt to access the method Failed: .<>f__AnonymousType0`1.get_Foo()"}

这只是芒果的安全模式,说“不”?有什么办法吗?感觉这是一个公共的访问者 – 所以觉得我应该能够调用它?

斯图尔特

解决方法

我猜你的ToSimplePropertyDictionary方法和实际的使用是在两个单独的程序集.这是您的问题的根源,因为从匿名类生成的编译器生成的类是内部的.这就是为什么你得到MethodAccessException异常.所以你需要使用 InternalsVisibleToAttribute来使它工作.此 SO question包含有关内部类型和反射的更多信息.

相关文章

在项目中使用SharpZipLib压缩文件夹的时候,遇到如果目录较深,则压缩包中的文件夹同样比较深的问题。比...
项目需要,几十万张照片需要计算出每个照片的特征值(调用C++编写的DLL)。 业务流程:选择照片...
var array = new byte[4]; var i = Encoding.UTF8.GetBytes(100.ToString(&quot;x2&quot;));//...
其实很简单,因为Combox的Item是一个K/V的object,那么就可以把它的items转换成IEnumerable&lt;Dic...
把.net4.6安装包打包进安装程序。 关键脚本如下: 头部引用字符串对比库 !include &quot;WordFunc....
项目需求(Winform)可以批量打印某个模板,经过百度和摸索,使用iTextSharp+ZXing.NetʿreeSp...