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

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

这仅仅是芒果的安全模型说“不”吗?有什么办法解决吗?感觉这是一个公共(public)的Get访问器-感觉我应该能够调用它?

斯图尔特

最佳答案

我猜您的ToSimplePropertyDictionary方法和实际用法位于两个单独的程序集中。这是问题的根源,因为从匿名类生成的编译器生成的类是internal。这就是为什么您会收到MethodAccessException异常的原因。因此,您需要使用InternalsVisibleToAttribute使其起作用。此SO question包含有关内部类型和反射的更多信息。

关于c# - 匿名类型和WP7.1上的Get访问器?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8273399/

10-11 08:25