我强烈怀疑child1
or child1.kind
属于类型dynamic
,这意味着无论其他情况如何,该表达式都被视为动态绑定表达式。
这是一个简短的但是complete举例说明我的意思:
using System;
class Test
{
public static T Foo<T>(object x)
{
return default(T);
}
public static void Main(string[] args)
{
object a = new object();
dynamic b = a;
var c = Foo<string>(a);
var d = Foo<string>(b);
Console.WriteLine(c.SomeRandomMember); // Invalid
Console.WriteLine(d.SomeRandomMember); // Valid
}
}
无效语句无效,因为类型c
is string
- 但后面的语句没问题,因为类型d
is dynamic
.
尽管只有一种可能的方法could在执行时绑定 - 即使该绑定始终有效 - 基本规则是几乎any表达式涉及一个dynamic
value 被认为是类型dynamic
。 (有一些例外,例如as
and new
.)
要使您的返回值非动态,只需将您的值转换为object
:
var obj = RedditDynamicObjectWrapperFactory.GetWrapper<LinkWrapper>
((object) child1.kind, (object) child1);
现在这将是一个静态地绑定调用。或者您可以将其保留为动态绑定调用,并使用类型表达式的隐式转换dynamic
到其他类型:
LinkWrapper obj = RedditDynamicObjectWrapperFactory.GetWrapper<LinkWrapper>(child1.kind, child1);