尽管该属性存在,但动态抛出RuntimeBinderException

时间:2019-12-21 10:33:08

标签: c# .net reflection .net-4.7.2

我遇到一种奇怪的情况,尽管我确定它存在,但尝试访问属性时却抛出了RuntimeBinderException(调试器显示如下):

enter image description here

dictionaryDictionary<int, CraftData>。但是,类型是从加载的Assembly中通过Reflection生成的,所以我无法直接进行转换。根据例外,似乎value仍被视为object(我尝试过dynamic value = item.Value,但它也没有起作用)。

很奇怪,我尝试在一个新项目中重现它,但也不例外:

class Program
{
    static void Main(string[] args)
    {
        // This works
        var objFromReflection = (object) new Foo();
        var dyn = objFromReflection as dynamic;
        Console.WriteLine(dyn.KnownProperty);

        // This also works but it does not work the same in my project
        IDictionary dictFromReflection = new Dictionary<int, Foo>() { { 1, new Foo() }, { 2, new Foo() } };
        foreach (DictionaryEntry item in dictFromReflection)
        {
            var key = (int)item.Key;
            var value = item.Value as dynamic;
            Console.WriteLine($"{key}: {value.KnownProperty}");
        }
    }
}

class Foo
{
    public string KnownProperty { get; set; } = "A";
    public string OtherProperty1 { get; set; }
    public string OtherProperty2 { get; set; }
}

所以我的问题:

  • 为什么我的独立代码有效,但上面的真实代码却无效?

  • 反正有没有使用反射功能来获得craftAmount吗?

我当前的解决方法:

  • 使用反射获取属性值。

  • 使用JsonConvert并使用JObject(我知道这很愚蠢)。

0 个答案:

没有答案