我遇到一种奇怪的情况,尽管我确定它存在,但尝试访问属性时却抛出了RuntimeBinderException
(调试器显示如下):
dictionary
是Dictionary<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
(我知道这很愚蠢)。