10

私は以下のような単純なオブジェクトを辞書コンバーターに書き込もうとしています:

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アクセサーのように感じます-それで、私はそれを呼び出すことができるはずだと感じますか?

スチュアート

4

2 に答える 2

8

ToSimplePropertyDictionaryあなたのメソッドと実際の使用法は、2 つの別々のアセンブリにあると思います。匿名クラスから生成されたコンパイラ生成クラスは であるため、これが問題の原因ですinternal。そのため、MethodAccessException例外が発生します。したがって、 InternalsVisibleToAttributeを使用して機能させる必要があります。This SO questionには、内部型とリフレクションに関する詳細情報が含まれています。

于 2011-11-25T19:44:49.270 に答える
1

BindingFlags.GetProperty を削除

これは、InvokeMember を使用するときにプロパティ値を取得するために使用されます。読み取り専用プロパティが返されるように指定するわけではありません。

EDIT:問題は実際にはpropertyInfo.GetGetMethod()にある可能性があります-次のいずれかを使用してみてください(最初のものしか使用したことがありません):

var value = propertyInfo.GetValue(input, null);
var value = propertyInfo.GetGetMethod().Invoke(input, null); 
于 2011-11-25T19:36:44.843 に答える