因此激活器返回的类型(此处未显示)只是我创建的POCO。没什么特别的。但是,尽管返回的对象GetWrapper
或GetWrapper<T>
的返回类型是动态类型的,因此intellisense正在查看返回的实际类的所有属性。有什么想法吗?
更新: 对不起,乔恩:
public static T GetWrapper<T>(object type, dynamic obj)
where T : class, IRedditObject
{
return GetWrapper(type, obj) as T;
}
public static object GetWrapper(object type, dynamic obj)
{
return Activator.CreateInstance(Types[type.ToString()], obj);
}
public class LinkWrapper : IRedditObject
{
private readonly dynamic _link;
public string Kind { get { return "t3"; } }
public dynamic Data { get { return _link.data; } }
public LinkWrapper(dynamic link)
{
_link = link;
}
public string Domain { get { return Data.domain; } }
}
[TestMethod]
public void Test()
{
var proxy = new SubredditProxy();
var dotnet = proxy.GetSubredditAsync("dotnet").Result;
var child1 = dotnet.data.children[0];
// this is being returned as dynamic
var obj = RedditDynamicObjectWrapperFactory.GetWrapper<LinkWrapper>(child1.kind, child1);
Assert.IsNotNull(obj);
}
答案 0 :(得分:7)
我强烈怀疑child1
或child1.kind
属于dynamic
类型,这意味着该表达式被认为是一个动态绑定的表达式,尽管其他一切。
这是一个简短的完整的示例,用于演示我的意思:
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
的类型为string
- 但后续语句没问题,因为d
的类型为dynamic
。
即使只有一种可能的方法可以在执行时绑定 - 即使该绑定始终有效 - 基本规则是任何涉及dynamic
值的表达式被视为dynamic
类型。 (有一些例外情况,例如as
和new
。)
要使您的返回值非动态,只需将值转换为object
:
var obj = RedditDynamicObjectWrapperFactory.GetWrapper<LinkWrapper>
((object) child1.kind, (object) child1);
现在将是静态绑定的调用。或者您可以将其保留为动态绑定调用,并使用从类型dynamic
的表达式到其他类型的隐式转换:
LinkWrapper obj = RedditDynamicObjectWrapperFactory.GetWrapper<LinkWrapper>(child1.kind, child1);