WP7.1上的匿名类型和Get访问器



我正在尝试编写一个简单的对象到字典转换器,如下所示:

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()"}

这只是芒果上的安全模型说"不"吗?还有别的办法吗?感觉这是一个公共Get访问器——所以我应该能够调用它?

斯图尔特

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

删除BindingFlags。GetProperty

这是用来在使用InvokeMember时获取一个属性值,它没有指定你想要返回一个只读属性。

编辑:问题实际上可能是与propertyInfo.GetGetMethod() -尝试使用以下之一(我只使用过第一个):

var value = propertyInfo.GetValue(input, null);
var value = propertyInfo.GetGetMethod().Invoke(input, null); 

相关内容

  • 没有找到相关文章

最新更新