[英]Why does this method keep returning dynamic despite the return type in the signature?
因此激活器返回的類型(此處未顯示)只是我創建的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);
}
我強烈懷疑,要么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);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.